From 92b1ccc935148e170eff602fed7697d979d6c172 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 3 Feb 2021 00:14:40 +0100 Subject: [PATCH] wiegand encode - now has option to add hid preamble or not --- client/src/cmdlfem410x.c | 6 +- client/src/cmdlfhid.c | 6 +- client/src/cmdwiegand.c | 6 +- client/src/wiegand_formats.c | 185 ++++++++++++++++++++++------------- client/src/wiegand_formats.h | 6 +- 5 files changed, 129 insertions(+), 80 deletions(-) diff --git a/client/src/cmdlfem410x.c b/client/src/cmdlfem410x.c index 5587017d2..04f0254aa 100644 --- a/client/src/cmdlfem410x.c +++ b/client/src/cmdlfem410x.c @@ -286,7 +286,7 @@ static int CmdEM410xWatch(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); CLIParserFree(ctx); - PrintAndLogEx(SUCCESS, "Watching for EM410x cards - place tag on antenna"); + PrintAndLogEx(SUCCESS, "Watching for EM410x cards - place tag on Proxmark3 antenna"); clearCommandBuffer(); SendCommandNG(CMD_LF_EM410X_WATCH, NULL, 0); return lfsim_wait_check(CMD_LF_EM410X_WATCH); @@ -542,14 +542,14 @@ static int CmdEM410xBrute(const char *Cmd) { } memcpy(testuid, uidblock + 5 * c, 5); - PrintAndLogEx(INFO, "Bruteforce %d / %d: simulating UID " _YELLOW_("%s") + PrintAndLogEx(INFO, "Bruteforce %d / %u: simulating UID " _YELLOW_("%s") , c + 1 , uidcnt , sprint_hex_inrow(testuid, sizeof(testuid)) ); em410x_construct_emul_graph(testuid, clk); - CmdLFSim(""); //240 start_gap. + CmdLFSim(""); msleep(delay); } free(uidblock); diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index 4550127be..47eeca45b 100644 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -58,7 +58,7 @@ static int sendTry(uint8_t format_idx, wiegand_card_t *card, uint32_t delay, boo wiegand_message_t packed; memset(&packed, 0, sizeof(wiegand_message_t)); - if (HIDPack(format_idx, card, &packed) == false) { + if (HIDPack(format_idx, card, &packed, true) == false) { PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format."); return PM3_ESOFT; } @@ -284,7 +284,7 @@ static int CmdHIDSim(const char *Cmd) { packed.Mid = mid; packed.Bot = bot; } else { - if (HIDPack(format_idx, &card, &packed) == false) { + if (HIDPack(format_idx, &card, &packed, true) == false) { PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format."); return PM3_ESOFT; } @@ -390,7 +390,7 @@ static int CmdHIDClone(const char *Cmd) { packed.Mid = mid; packed.Bot = bot; } else { - if (HIDPack(format_idx, &card, &packed) == false) { + if (HIDPack(format_idx, &card, &packed, true) == false) { PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format."); return PM3_ESOFT; } diff --git a/client/src/cmdwiegand.c b/client/src/cmdwiegand.c index 3fcce3214..55e4d6e9c 100644 --- a/client/src/cmdwiegand.c +++ b/client/src/cmdwiegand.c @@ -60,6 +60,7 @@ int CmdWiegandEncode(const char *Cmd) { arg_u64_0(NULL, "issue", "", "issue level"), arg_u64_0(NULL, "oem", "", "OEM code"), arg_str0("w", "wiegand", "", "see `wiegand list` for available formats"), + arg_lit0(NULL, "pre", "add HID preamble to wiegand"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); @@ -75,6 +76,7 @@ int CmdWiegandEncode(const char *Cmd) { int len = 0; char format[16] = {0}; CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)format, sizeof(format), &len); + bool preamble = arg_get_lit(ctx, 6); CLIParserFree(ctx); int idx = -1; @@ -89,14 +91,14 @@ int CmdWiegandEncode(const char *Cmd) { if (idx != -1) { wiegand_message_t packed; memset(&packed, 0, sizeof(wiegand_message_t)); - if (HIDPack(idx, &data, &packed) == false) { + if (HIDPack(idx, &data, &packed, preamble) == false) { PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format."); return PM3_ESOFT; } print_wiegand_code(&packed); } else { // try all formats and print only the ones that work. - HIDPackTryAll(&data); + HIDPackTryAll(&data, preamble); } return PM3_SUCCESS; } diff --git a/client/src/wiegand_formats.c b/client/src/wiegand_formats.c index ba8169d37..b2ec25e4c 100644 --- a/client/src/wiegand_formats.c +++ b/client/src/wiegand_formats.c @@ -12,7 +12,7 @@ #include "commonutil.h" -static bool Pack_H10301(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_H10301(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFF) return false; // Can't encode FC. @@ -25,7 +25,9 @@ static bool Pack_H10301(wiegand_card_t *card, wiegand_message_t *packed) { packed->Bot |= (card->FacilityCode & 0xFF) << 17; packed->Bot |= oddparity32((packed->Bot >> 1) & 0xFFF) & 1; packed->Bot |= (evenparity32((packed->Bot >> 13) & 0xFFF) & 1) << 25; - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_H10301(wiegand_message_t *packed, wiegand_card_t *card) { @@ -40,7 +42,7 @@ static bool Unpack_H10301(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_Tecom27(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Tecom27(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x7FF) return false; // Can't encode FC. @@ -51,7 +53,9 @@ static bool Pack_Tecom27(wiegand_card_t *card, wiegand_message_t *packed) { packed->Length = 27; set_nonlinear_field(packed, card->FacilityCode, 10, (uint8_t[]) {15, 19, 24, 23, 22, 18, 6, 10, 14, 3, 2}); set_nonlinear_field(packed, card->CardNumber, 16, (uint8_t[]) {0, 1, 13, 12, 9, 26, 20, 16, 17, 21, 25, 7, 8, 11, 4, 5}); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Tecom27(wiegand_message_t *packed, wiegand_card_t *card) { @@ -64,7 +68,7 @@ static bool Unpack_Tecom27(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_2804W(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_2804W(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x0FF) return false; // Can't encode FC. @@ -84,7 +88,9 @@ static bool Pack_2804W(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, oddparity32(get_linear_field(packed, 0, 27)) , 27); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_2804W(wiegand_message_t *packed, wiegand_card_t *card) { @@ -101,7 +107,7 @@ static bool Unpack_2804W(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_ATSW30(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_ATSW30(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. @@ -118,7 +124,9 @@ static bool Pack_ATSW30(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, oddparity32(get_linear_field(packed, 13, 16)) , 29); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_ATSW30(wiegand_message_t *packed, wiegand_card_t *card) { @@ -134,7 +142,7 @@ static bool Unpack_ATSW30(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_ADT31(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_ADT31(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x0F) return false; // Can't encode FC. @@ -146,7 +154,9 @@ static bool Pack_ADT31(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->FacilityCode, 1, 4); set_linear_field(packed, card->CardNumber, 5, 23); // Parity not known, but 4 bits are unused. - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_ADT31(wiegand_message_t *packed, wiegand_card_t *card) { @@ -158,7 +168,7 @@ static bool Unpack_ADT31(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_Kastle(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Kastle(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x00FF) return false; // Can't encode FC. @@ -173,7 +183,9 @@ static bool Pack_Kastle(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 15, 16); set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 16)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 14, 17)), 31); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Kastle(wiegand_message_t *packed, wiegand_card_t *card) { @@ -191,7 +203,7 @@ static bool Unpack_Kastle(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_Kantech(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Kantech(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFF) return false; // Can't encode FC. @@ -202,7 +214,9 @@ static bool Pack_Kantech(wiegand_card_t *card, wiegand_message_t *packed) { packed->Length = 32; set_linear_field(packed, card->FacilityCode, 7, 8); set_linear_field(packed, card->CardNumber, 15, 16); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Kantech(wiegand_message_t *packed, wiegand_card_t *card) { @@ -214,7 +228,7 @@ static bool Unpack_Kantech(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_D10202(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_D10202(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x007F) return false; // Can't encode FC. @@ -227,7 +241,9 @@ static bool Pack_D10202(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 8, 24); set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 16)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 16, 16)), 32); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_D10202(wiegand_message_t *packed, wiegand_card_t *card) { @@ -243,7 +259,7 @@ static bool Unpack_D10202(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_H10306(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_H10306(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFFFF) return false; // Can't encode FC. @@ -257,7 +273,9 @@ static bool Pack_H10306(wiegand_card_t *card, wiegand_message_t *packed) { packed->Mid |= (card->FacilityCode & 0x8000) >> 15; packed->Mid |= (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xFFFE0000)) & 1) << 1; packed->Bot |= (oddparity32(packed->Bot & 0x0001FFFE) & 1); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_H10306(wiegand_message_t *packed, wiegand_card_t *card) { @@ -275,7 +293,7 @@ static bool Unpack_H10306(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_N10002(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_N10002(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFF) return false; // Can't encode FC. @@ -286,7 +304,9 @@ static bool Pack_N10002(wiegand_card_t *card, wiegand_message_t *packed) { packed->Length = 34; // Set number of bits set_linear_field(packed, card->FacilityCode, 9, 8); set_linear_field(packed, card->CardNumber, 17, 16); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_N10002(wiegand_message_t *packed, wiegand_card_t *card) { @@ -299,7 +319,7 @@ static bool Unpack_N10002(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_C1k35s(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_C1k35s(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. @@ -314,7 +334,9 @@ static bool Pack_C1k35s(wiegand_card_t *card, wiegand_message_t *packed) { packed->Mid |= (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xB6DB6DB6)) & 1) << 1; packed->Bot |= (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0x6DB6DB6C)) & 1); packed->Mid |= (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0xFFFFFFFF)) & 1) << 2; - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_C1k35s(wiegand_message_t *packed, wiegand_card_t *card) { @@ -331,7 +353,7 @@ static bool Unpack_C1k35s(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_H10320(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_H10320(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) @@ -356,7 +378,9 @@ static bool Pack_H10320(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, evenparity32( get_nonlinear_field(packed, 8, (uint8_t[]) {3, 7, 11, 15, 19, 23, 29, 31}) ), 35); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_H10320(wiegand_message_t *packed, wiegand_card_t *card) { @@ -383,7 +407,7 @@ static bool Unpack_H10320(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_S12906(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_S12906(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0xFF) return false; // Can't encode FC. @@ -397,7 +421,9 @@ static bool Pack_S12906(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 11, 24); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 1, 17)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 17, 18)), 35); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_S12906(wiegand_message_t *packed, wiegand_card_t *card) { @@ -414,7 +440,7 @@ static bool Unpack_S12906(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_Sie36(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Sie36(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x0003FFFF) return false; // Can't encode FC. @@ -431,7 +457,9 @@ static bool Pack_Sie36(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, evenparity32(get_nonlinear_field(packed, 23, (uint8_t[]) {1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34})) , 35); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Sie36(wiegand_message_t *packed, wiegand_card_t *card) { @@ -447,7 +475,7 @@ static bool Unpack_Sie36(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_C15001(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_C15001(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x000000FF) return false; // Can't encode FC. @@ -461,7 +489,9 @@ static bool Pack_C15001(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 19, 16); set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 17)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 17)), 35); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_C15001(wiegand_message_t *packed, wiegand_card_t *card) { @@ -478,7 +508,7 @@ static bool Unpack_C15001(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_H10302(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_H10302(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) @@ -490,7 +520,9 @@ static bool Pack_H10302(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 1, 35); set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 18)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_H10302(wiegand_message_t *packed, wiegand_card_t *card) { @@ -505,7 +537,7 @@ static bool Unpack_H10302(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_H10304(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_H10304(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC. @@ -520,7 +552,9 @@ static bool Pack_H10304(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 18)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_H10304(wiegand_message_t *packed, wiegand_card_t *card) { @@ -536,7 +570,7 @@ static bool Unpack_H10304(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_HGeneric37(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_HGeneric37(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0) return false; // Not used in this format @@ -552,26 +586,25 @@ static bool Pack_HGeneric37(wiegand_card_t *card, wiegand_message_t *packed) { // even1 set_bit_by_position(packed, - evenparity32( - get_nonlinear_field(packed, 8, (uint8_t[]) {4, 8, 12, 16, 20, 24, 28, 32}) - ) - , 0 - ); + evenparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {4, 8, 12, 16, 20, 24, 28, 32})) + , 0 + ); // odd1 set_bit_by_position(packed, - oddparity32( - get_nonlinear_field(packed, 8, (uint8_t[]) {6, 10, 14, 18, 22, 26, 30, 34}) - ) - , 2 - ); + oddparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {6, 10, 14, 18, 22, 26, 30, 34})) + , 2 + ); // even2 set_bit_by_position(packed, - evenparity32( - get_nonlinear_field(packed, 8, (uint8_t[]) {7, 11, 15, 19, 23, 27, 31, 35}) - ) - , 3 - ); - return add_HID_header(packed); + evenparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {7, 11, 15, 19, 23, 27, 31, 35})) + , 3 + ); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_HGeneric37(wiegand_message_t *packed, wiegand_card_t *card) { @@ -589,7 +622,7 @@ static bool Unpack_HGeneric37(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_MDI37(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_MDI37(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (card->FacilityCode > 0x0000F) return false; // Can't encode FC. @@ -604,7 +637,9 @@ static bool Pack_MDI37(wiegand_card_t *card, wiegand_message_t *packed) { set_bit_by_position(packed, evenparity32(get_linear_field(packed, 1, 18)), 0); set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_MDI37(wiegand_message_t *packed, wiegand_card_t *card) { @@ -622,7 +657,7 @@ static bool Unpack_MDI37(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_P10001(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_P10001(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -641,7 +676,9 @@ static bool Pack_P10001(wiegand_card_t *card, wiegand_message_t *packed) { get_linear_field(packed, 16, 8) ^ get_linear_field(packed, 24, 8) , 32, 8); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_P10001(wiegand_message_t *packed, wiegand_card_t *card) { @@ -661,7 +698,7 @@ static bool Unpack_P10001(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_C1k48s(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_C1k48s(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -677,7 +714,9 @@ static bool Pack_C1k48s(wiegand_card_t *card, wiegand_message_t *packed) { packed->Mid |= (evenparity32((packed->Mid & 0x00001B6D) ^ (packed->Bot & 0xB6DB6DB6)) & 1) << 14; packed->Bot |= (oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C)) & 1); packed->Mid |= (oddparity32((packed->Mid & 0x00007FFF) ^ (packed->Bot & 0xFFFFFFFF)) & 1) << 15; - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_C1k48s(wiegand_message_t *packed, wiegand_card_t *card) { @@ -694,7 +733,7 @@ static bool Unpack_C1k48s(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_CasiRusco40(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_CasiRusco40(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -706,7 +745,9 @@ static bool Pack_CasiRusco40(wiegand_card_t *card, wiegand_message_t *packed) { packed->Length = 40; // Set number of bits set_linear_field(packed, card->CardNumber, 1, 38); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_CasiRusco40(wiegand_message_t *packed, wiegand_card_t *card) { @@ -718,7 +759,7 @@ static bool Unpack_CasiRusco40(wiegand_message_t *packed, wiegand_card_t *card) return true; } -static bool Pack_Optus(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Optus(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -731,7 +772,9 @@ static bool Pack_Optus(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->CardNumber, 1, 16); set_linear_field(packed, card->FacilityCode, 22, 11); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Optus(wiegand_message_t *packed, wiegand_card_t *card) { @@ -744,7 +787,7 @@ static bool Unpack_Optus(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_Smartpass(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_Smartpass(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -758,7 +801,9 @@ static bool Pack_Smartpass(wiegand_card_t *card, wiegand_message_t *packed) { set_linear_field(packed, card->FacilityCode, 1, 13); set_linear_field(packed, card->IssueLevel, 14, 3); set_linear_field(packed, card->CardNumber, 17, 16); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_Smartpass(wiegand_message_t *packed, wiegand_card_t *card) { @@ -772,7 +817,7 @@ static bool Unpack_Smartpass(wiegand_message_t *packed, wiegand_card_t *card) { return true; } -static bool Pack_bqt(wiegand_card_t *card, wiegand_message_t *packed) { +static bool Pack_bqt(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); @@ -793,7 +838,9 @@ static bool Pack_bqt(wiegand_card_t *card, wiegand_message_t *packed) { oddparity32(get_linear_field(packed, 17, 16)) , 33); - return add_HID_header(packed); + if (preamble) + return add_HID_header(packed); + return true; } static bool Unpack_bqt(wiegand_message_t *packed, wiegand_card_t *card) { @@ -920,16 +967,16 @@ int HIDFindCardFormat(const char *format) { return -1; } -bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed) { +bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed, bool preamble) { memset(packed, 0, sizeof(wiegand_message_t)); if (format_idx < 0 || format_idx >= ARRAYLEN(FormatTable)) return false; - return FormatTable[format_idx].Pack(card, packed); + return FormatTable[format_idx].Pack(card, packed, preamble); } -void HIDPackTryAll(wiegand_card_t *card) { +void HIDPackTryAll(wiegand_card_t *card, bool preamble) { PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "%-10s %-30s --> Encoded wiegand", "Name", "Description"); @@ -939,7 +986,7 @@ void HIDPackTryAll(wiegand_card_t *card) { int i = 0; while (FormatTable[i].Name) { memset(&packed, 0, sizeof(wiegand_message_t)); - bool res = FormatTable[i].Pack(card, &packed); + bool res = FormatTable[i].Pack(card, &packed, preamble); if (res) { cardformat_t fmt = HIDGetCardFormat(i); print_desc_wiegand(&fmt, &packed); diff --git a/client/src/wiegand_formats.h b/client/src/wiegand_formats.h index 531de1e12..921b1840a 100644 --- a/client/src/wiegand_formats.h +++ b/client/src/wiegand_formats.h @@ -33,7 +33,7 @@ typedef struct { // Structure for defined Wiegand card formats available for packing/unpacking typedef struct { const char *Name; - bool (*Pack)(wiegand_card_t *card, wiegand_message_t *packed); + bool (*Pack)(wiegand_card_t *card, wiegand_message_t *packed, bool preamble); bool (*Unpack)(wiegand_message_t *packed, wiegand_card_t *card); const char *Descrp; cardformatdescriptor_t Fields; @@ -42,9 +42,9 @@ typedef struct { void HIDListFormats(void); int HIDFindCardFormat(const char *format); cardformat_t HIDGetCardFormat(int idx); -bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed); +bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed, bool preamble); bool HIDTryUnpack(wiegand_message_t *packed, bool ignore_parity); -void HIDPackTryAll(wiegand_card_t *card); +void HIDPackTryAll(wiegand_card_t *card, bool preamble); void print_wiegand_code(wiegand_message_t *packed); void print_desc_wiegand(cardformat_t *fmt, wiegand_message_t *packed); #endif