wiegand encode - now has option to add hid preamble or not

This commit is contained in:
iceman1001 2021-02-03 00:14:40 +01:00
commit 92b1ccc935
5 changed files with 129 additions and 80 deletions

View file

@ -286,7 +286,7 @@ static int CmdEM410xWatch(const char *Cmd) {
CLIExecWithReturn(ctx, Cmd, argtable, true); CLIExecWithReturn(ctx, Cmd, argtable, true);
CLIParserFree(ctx); CLIParserFree(ctx);
PrintAndLogEx(SUCCESS, "Watching for EM410x cards - place tag on antenna"); PrintAndLogEx(SUCCESS, "Watching for EM410x cards - place tag on Proxmark3 antenna");
clearCommandBuffer(); clearCommandBuffer();
SendCommandNG(CMD_LF_EM410X_WATCH, NULL, 0); SendCommandNG(CMD_LF_EM410X_WATCH, NULL, 0);
return lfsim_wait_check(CMD_LF_EM410X_WATCH); return lfsim_wait_check(CMD_LF_EM410X_WATCH);
@ -542,14 +542,14 @@ static int CmdEM410xBrute(const char *Cmd) {
} }
memcpy(testuid, uidblock + 5 * c, 5); 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 , c + 1
, uidcnt , uidcnt
, sprint_hex_inrow(testuid, sizeof(testuid)) , sprint_hex_inrow(testuid, sizeof(testuid))
); );
em410x_construct_emul_graph(testuid, clk); em410x_construct_emul_graph(testuid, clk);
CmdLFSim(""); //240 start_gap. CmdLFSim("");
msleep(delay); msleep(delay);
} }
free(uidblock); free(uidblock);

View file

@ -58,7 +58,7 @@ static int sendTry(uint8_t format_idx, wiegand_card_t *card, uint32_t delay, boo
wiegand_message_t packed; wiegand_message_t packed;
memset(&packed, 0, sizeof(wiegand_message_t)); 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."); PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format.");
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -284,7 +284,7 @@ static int CmdHIDSim(const char *Cmd) {
packed.Mid = mid; packed.Mid = mid;
packed.Bot = bot; packed.Bot = bot;
} else { } 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."); PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format.");
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -390,7 +390,7 @@ static int CmdHIDClone(const char *Cmd) {
packed.Mid = mid; packed.Mid = mid;
packed.Bot = bot; packed.Bot = bot;
} else { } 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."); PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format.");
return PM3_ESOFT; return PM3_ESOFT;
} }

View file

@ -60,6 +60,7 @@ int CmdWiegandEncode(const char *Cmd) {
arg_u64_0(NULL, "issue", "<dec>", "issue level"), arg_u64_0(NULL, "issue", "<dec>", "issue level"),
arg_u64_0(NULL, "oem", "<dec>", "OEM code"), arg_u64_0(NULL, "oem", "<dec>", "OEM code"),
arg_str0("w", "wiegand", "<format>", "see `wiegand list` for available formats"), arg_str0("w", "wiegand", "<format>", "see `wiegand list` for available formats"),
arg_lit0(NULL, "pre", "add HID preamble to wiegand"),
arg_param_end arg_param_end
}; };
CLIExecWithReturn(ctx, Cmd, argtable, true); CLIExecWithReturn(ctx, Cmd, argtable, true);
@ -75,6 +76,7 @@ int CmdWiegandEncode(const char *Cmd) {
int len = 0; int len = 0;
char format[16] = {0}; char format[16] = {0};
CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)format, sizeof(format), &len); CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)format, sizeof(format), &len);
bool preamble = arg_get_lit(ctx, 6);
CLIParserFree(ctx); CLIParserFree(ctx);
int idx = -1; int idx = -1;
@ -89,14 +91,14 @@ int CmdWiegandEncode(const char *Cmd) {
if (idx != -1) { if (idx != -1) {
wiegand_message_t packed; wiegand_message_t packed;
memset(&packed, 0, sizeof(wiegand_message_t)); 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."); PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format.");
return PM3_ESOFT; return PM3_ESOFT;
} }
print_wiegand_code(&packed); print_wiegand_code(&packed);
} else { } else {
// try all formats and print only the ones that work. // try all formats and print only the ones that work.
HIDPackTryAll(&data); HIDPackTryAll(&data, preamble);
} }
return PM3_SUCCESS; return PM3_SUCCESS;
} }

View file

@ -12,7 +12,7 @@
#include "commonutil.h" #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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFF) return false; // Can't encode FC. 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 |= (card->FacilityCode & 0xFF) << 17;
packed->Bot |= oddparity32((packed->Bot >> 1) & 0xFFF) & 1; packed->Bot |= oddparity32((packed->Bot >> 1) & 0xFFF) & 1;
packed->Bot |= (evenparity32((packed->Bot >> 13) & 0xFFF) & 1) << 25; 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x7FF) return false; // Can't encode FC. 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; 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->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}); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0FF) return false; // Can't encode FC. 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, set_bit_by_position(packed,
oddparity32(get_linear_field(packed, 0, 27)) oddparity32(get_linear_field(packed, 0, 27))
, 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. 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, set_bit_by_position(packed,
oddparity32(get_linear_field(packed, 13, 16)) oddparity32(get_linear_field(packed, 13, 16))
, 29); , 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0F) return false; // Can't encode FC. 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->FacilityCode, 1, 4);
set_linear_field(packed, card->CardNumber, 5, 23); set_linear_field(packed, card->CardNumber, 5, 23);
// Parity not known, but 4 bits are unused. // 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x00FF) return false; // Can't encode FC. 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_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, evenparity32(get_linear_field(packed, 1, 16)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 14, 17)), 31); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFF) return false; // Can't encode FC. 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; packed->Length = 32;
set_linear_field(packed, card->FacilityCode, 7, 8); set_linear_field(packed, card->FacilityCode, 7, 8);
set_linear_field(packed, card->CardNumber, 15, 16); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x007F) return false; // Can't encode FC. 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_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, evenparity32(get_linear_field(packed, 1, 16)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 16, 16)), 32); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFFFF) return false; // Can't encode FC. 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 |= (card->FacilityCode & 0x8000) >> 15;
packed->Mid |= (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xFFFE0000)) & 1) << 1; packed->Mid |= (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xFFFE0000)) & 1) << 1;
packed->Bot |= (oddparity32(packed->Bot & 0x0001FFFE) & 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFF) return false; // Can't encode FC. 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 packed->Length = 34; // Set number of bits
set_linear_field(packed, card->FacilityCode, 9, 8); set_linear_field(packed, card->FacilityCode, 9, 8);
set_linear_field(packed, card->CardNumber, 17, 16); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. 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->Mid |= (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xB6DB6DB6)) & 1) << 1;
packed->Bot |= (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0x6DB6DB6C)) & 1); packed->Bot |= (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0x6DB6DB6C)) & 1);
packed->Mid |= (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0xFFFFFFFF)) & 1) << 2; 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) 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( set_bit_by_position(packed, evenparity32(
get_nonlinear_field(packed, 8, (uint8_t[]) {3, 7, 11, 15, 19, 23, 29, 31}) get_nonlinear_field(packed, 8, (uint8_t[]) {3, 7, 11, 15, 19, 23, 29, 31})
), 35); ), 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0xFF) return false; // Can't encode FC. 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_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, 1, 17)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 17, 18)), 35); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0003FFFF) return false; // Can't encode FC. 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, 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})) 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); , 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x000000FF) return false; // Can't encode FC. 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_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, evenparity32(get_linear_field(packed, 1, 17)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 17)), 35); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) 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_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, evenparity32(get_linear_field(packed, 1, 18)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC. 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, evenparity32(get_linear_field(packed, 1, 18)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); 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) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0) return false; // Not used in this format 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 // even1
set_bit_by_position(packed, set_bit_by_position(packed,
evenparity32( evenparity32(
get_nonlinear_field(packed, 8, (uint8_t[]) {4, 8, 12, 16, 20, 24, 28, 32}) get_nonlinear_field(packed, 8, (uint8_t[]) {4, 8, 12, 16, 20, 24, 28, 32}))
) , 0
, 0 );
);
// odd1 // odd1
set_bit_by_position(packed, set_bit_by_position(packed,
oddparity32( oddparity32(
get_nonlinear_field(packed, 8, (uint8_t[]) {6, 10, 14, 18, 22, 26, 30, 34}) get_nonlinear_field(packed, 8, (uint8_t[]) {6, 10, 14, 18, 22, 26, 30, 34}))
) , 2
, 2 );
);
// even2 // even2
set_bit_by_position(packed, set_bit_by_position(packed,
evenparity32( evenparity32(
get_nonlinear_field(packed, 8, (uint8_t[]) {7, 11, 15, 19, 23, 27, 31, 35}) get_nonlinear_field(packed, 8, (uint8_t[]) {7, 11, 15, 19, 23, 27, 31, 35}))
) , 3
, 3 );
); if (preamble)
return add_HID_header(packed); return add_HID_header(packed);
return true;
} }
static bool Unpack_HGeneric37(wiegand_message_t *packed, wiegand_card_t *card) { 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; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0000F) return false; // Can't encode FC. 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, evenparity32(get_linear_field(packed, 1, 18)), 0);
set_bit_by_position(packed, oddparity32(get_linear_field(packed, 18, 18)), 36); 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) { 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; 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)); 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, 16, 8) ^
get_linear_field(packed, 24, 8) get_linear_field(packed, 24, 8)
, 32, 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) { 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; 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)); 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->Mid |= (evenparity32((packed->Mid & 0x00001B6D) ^ (packed->Bot & 0xB6DB6DB6)) & 1) << 14;
packed->Bot |= (oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C)) & 1); packed->Bot |= (oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C)) & 1);
packed->Mid |= (oddparity32((packed->Mid & 0x00007FFF) ^ (packed->Bot & 0xFFFFFFFF)) & 1) << 15; 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) { 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; 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)); 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 packed->Length = 40; // Set number of bits
set_linear_field(packed, card->CardNumber, 1, 38); 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) { 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; 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)); 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->CardNumber, 1, 16);
set_linear_field(packed, card->FacilityCode, 22, 11); 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) { 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; 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)); 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->FacilityCode, 1, 13);
set_linear_field(packed, card->IssueLevel, 14, 3); set_linear_field(packed, card->IssueLevel, 14, 3);
set_linear_field(packed, card->CardNumber, 17, 16); 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) { 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; 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)); 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)) oddparity32(get_linear_field(packed, 17, 16))
, 33); , 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) { static bool Unpack_bqt(wiegand_message_t *packed, wiegand_card_t *card) {
@ -920,16 +967,16 @@ int HIDFindCardFormat(const char *format) {
return -1; 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)); memset(packed, 0, sizeof(wiegand_message_t));
if (format_idx < 0 || format_idx >= ARRAYLEN(FormatTable)) if (format_idx < 0 || format_idx >= ARRAYLEN(FormatTable))
return false; 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(NORMAL, "");
PrintAndLogEx(INFO, "%-10s %-30s --> Encoded wiegand", "Name", "Description"); PrintAndLogEx(INFO, "%-10s %-30s --> Encoded wiegand", "Name", "Description");
@ -939,7 +986,7 @@ void HIDPackTryAll(wiegand_card_t *card) {
int i = 0; int i = 0;
while (FormatTable[i].Name) { while (FormatTable[i].Name) {
memset(&packed, 0, sizeof(wiegand_message_t)); memset(&packed, 0, sizeof(wiegand_message_t));
bool res = FormatTable[i].Pack(card, &packed); bool res = FormatTable[i].Pack(card, &packed, preamble);
if (res) { if (res) {
cardformat_t fmt = HIDGetCardFormat(i); cardformat_t fmt = HIDGetCardFormat(i);
print_desc_wiegand(&fmt, &packed); print_desc_wiegand(&fmt, &packed);

View file

@ -33,7 +33,7 @@ typedef struct {
// Structure for defined Wiegand card formats available for packing/unpacking // Structure for defined Wiegand card formats available for packing/unpacking
typedef struct { typedef struct {
const char *Name; 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); bool (*Unpack)(wiegand_message_t *packed, wiegand_card_t *card);
const char *Descrp; const char *Descrp;
cardformatdescriptor_t Fields; cardformatdescriptor_t Fields;
@ -42,9 +42,9 @@ typedef struct {
void HIDListFormats(void); void HIDListFormats(void);
int HIDFindCardFormat(const char *format); int HIDFindCardFormat(const char *format);
cardformat_t HIDGetCardFormat(int idx); 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); 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_wiegand_code(wiegand_message_t *packed);
void print_desc_wiegand(cardformat_t *fmt, wiegand_message_t *packed); void print_desc_wiegand(cardformat_t *fmt, wiegand_message_t *packed);
#endif #endif