diff --git a/client/cmdlfnedap.c b/client/cmdlfnedap.c index ec2837d7a..b186a1354 100644 --- a/client/cmdlfnedap.c +++ b/client/cmdlfnedap.c @@ -480,15 +480,15 @@ int CmdLFNedapClone(const char *Cmd) { if (i == 0) { SetConfigWithBlock0(blocks[0]); - if ( t55xxAquireAndCompareBlock0(false, 0, blocks[0], false) ) + if (t55xxAquireAndCompareBlock0(false, 0, blocks[0], false)) continue; } - + if (t55xxVerifyWrite(i, 0, false, false, 0, 0xFF, blocks[i]) == false) res++; } - if ( res == 0 ) + if (res == 0) PrintAndLogEx(SUCCESS, "Success writing to tag"); else { PrintAndLogEx(NORMAL, ""); diff --git a/client/cmdlfnoralsy.c b/client/cmdlfnoralsy.c index 2d9481782..fe469720b 100644 --- a/client/cmdlfnoralsy.c +++ b/client/cmdlfnoralsy.c @@ -179,15 +179,15 @@ static int CmdNoralsyClone(const char *Cmd) { if (i == 0) { SetConfigWithBlock0(blocks[0]); - if ( t55xxAquireAndCompareBlock0(false, 0, blocks[0], false) ) + if (t55xxAquireAndCompareBlock0(false, 0, blocks[0], false)) continue; } - + if (t55xxVerifyWrite(i, 0, false, false, 0, 0xFF, blocks[i]) == false) res++; } - if ( res == 0 ) + if (res == 0) PrintAndLogEx(SUCCESS, "Success writing to tag"); return PM3_SUCCESS; diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 39587c5ea..f563e2ef8 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -146,7 +146,7 @@ static int CmdPrescoClone(const char *Cmd) { if (i == 0) { SetConfigWithBlock0(blocks[0]); - if ( t55xxAquireAndCompareBlock0(false, 0, blocks[0], false) ) + if (t55xxAquireAndCompareBlock0(false, 0, blocks[0], false)) continue; } @@ -155,9 +155,9 @@ static int CmdPrescoClone(const char *Cmd) { } - if ( res == 0 ) + if (res == 0) PrintAndLogEx(SUCCESS, "Success writing to tag"); - + return PM3_SUCCESS; } diff --git a/client/cmdlfpyramid.c b/client/cmdlfpyramid.c index 90e5c23d7..216e0834e 100644 --- a/client/cmdlfpyramid.c +++ b/client/cmdlfpyramid.c @@ -256,18 +256,18 @@ static int CmdPyramidClone(const char *Cmd) { if (i == 0) { SetConfigWithBlock0(blocks[0]); - if ( t55xxAquireAndCompareBlock0(false, 0, blocks[0], false) ) + if (t55xxAquireAndCompareBlock0(false, 0, blocks[0], false)) continue; } - + if (t55xxVerifyWrite(i, 0, false, false, 0, 0xFF, blocks[i]) == false) res++; } - if ( res == 0 ) + if (res == 0) PrintAndLogEx(SUCCESS, "Success writing to tag"); - + return PM3_SUCCESS; } diff --git a/client/cmdlfviking.c b/client/cmdlfviking.c index 45fe9ffb6..9bbbeaa7e 100644 --- a/client/cmdlfviking.c +++ b/client/cmdlfviking.c @@ -90,14 +90,14 @@ static int CmdVikingClone(const char *Cmd) { uint8_t blocks[8]; } PACKED payload; payload.Q5 = Q5; - + num_to_bytes(rawID, 8, &payload.blocks[0]); PrintAndLogEx(INFO, "Preparing to clone Viking tag - ID " _YELLOW_("%08X")" raw " _YELLOW_("%s"), id, sprint_hex(payload.blocks, sizeof(payload.blocks))); - + clearCommandBuffer(); - - SendCommandNG(CMD_LF_VIKING_CLONE, (uint8_t*)&payload, sizeof(payload)); + + SendCommandNG(CMD_LF_VIKING_CLONE, (uint8_t *)&payload, sizeof(payload)); PacketResponseNG resp; if (!WaitForResponseTimeout(CMD_LF_VIKING_CLONE, &resp, T55XX_WRITE_TIMEOUT)) { PrintAndLogEx(ERR, "Error occurred, device did not respond during write operation."); diff --git a/client/cmdlfvisa2000.c b/client/cmdlfvisa2000.c index f23a7c5a8..9f80a830d 100644 --- a/client/cmdlfvisa2000.c +++ b/client/cmdlfvisa2000.c @@ -169,7 +169,7 @@ static int CmdVisa2kClone(const char *Cmd) { uint8_t res = 0; PacketResponseNG resp; - + // fast push mode conn.block_after_ACK = true; for (uint8_t i = 0; i < 4; i++) { @@ -193,15 +193,15 @@ static int CmdVisa2kClone(const char *Cmd) { if (i == 0) { SetConfigWithBlock0(blocks[0]); - if ( t55xxAquireAndCompareBlock0(false, 0, blocks[0], false) ) + if (t55xxAquireAndCompareBlock0(false, 0, blocks[0], false)) continue; } - + if (t55xxVerifyWrite(i, 0, false, false, 0, 0xFF, blocks[i]) == false) res++; } - - if ( res == 0 ) + + if (res == 0) PrintAndLogEx(SUCCESS, "Success writing to tag"); return PM3_SUCCESS; diff --git a/client/cmdwiegand.c b/client/cmdwiegand.c index 0b567d514..8c1b5e8cb 100644 --- a/client/cmdwiegand.c +++ b/client/cmdwiegand.c @@ -20,7 +20,7 @@ #include "cmdhflist.h" // annotations #include "wiegand_formats.h" #include "wiegand_formatutils.h" -#include "util.h" +#include "util.h" static int CmdHelp(const char *Cmd); @@ -52,18 +52,18 @@ static int usage_wiegand_decode() { return PM3_SUCCESS; } -void PrintTagId(wiegand_message_t *packed){ +void PrintTagId(wiegand_message_t *packed) { if (packed->Top != 0) { PrintAndLogEx(SUCCESS, "Card ID: %X%08X%08X", - (uint32_t)packed->Top, - (uint32_t)packed->Mid, - (uint32_t)packed->Bot) - ; + (uint32_t)packed->Top, + (uint32_t)packed->Mid, + (uint32_t)packed->Bot) + ; } else { PrintAndLogEx(SUCCESS, "Card ID: %X%08X", - (uint32_t)packed->Mid, - (uint32_t)packed->Bot) - ; + (uint32_t)packed->Mid, + (uint32_t)packed->Bot) + ; } } @@ -88,7 +88,7 @@ int CmdWiegandEncode(const char *Cmd) { int format_idx = -1; char format[16] = {0}; - + wiegand_card_t data; memset(&data, 0, sizeof(wiegand_card_t)); @@ -133,12 +133,12 @@ int CmdWiegandEncode(const char *Cmd) { wiegand_message_t packed; memset(&packed, 0, sizeof(wiegand_message_t)); - + if (HIDPack(format_idx, &data, &packed) == false) { PrintAndLogEx(WARNING, "The card data could not be encoded in the selected format."); return PM3_ESOFT; } - + PrintTagId(&packed); return PM3_SUCCESS; } @@ -152,7 +152,7 @@ int CmdWiegandDecode(const char *Cmd) { while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { uint32_t strlen = param_getlength(Cmd, cmdp); strlen++; // null termin - if ( strlen > 2 ) { + if (strlen > 2) { char *s = calloc(strlen, sizeof(uint8_t)); param_getstr(Cmd, cmdp, s, strlen); hexstring_to_u96(&top, &mid, &bot, s); @@ -176,11 +176,11 @@ int CmdWiegandDecode(const char *Cmd) { } if (gothex == false) errors = true; - + if (errors || cmdp < 1) return usage_wiegand_decode(); wiegand_message_t packed = initialize_message_object(top, mid, bot); - + HIDTryUnpack(&packed, ignore_parity); return PM3_SUCCESS; } diff --git a/client/util.c b/client/util.c index f74605562..da1b5d0e2 100644 --- a/client/util.c +++ b/client/util.c @@ -885,10 +885,10 @@ char *strmcopy(const char *buf) { * * Returns the number of nibbles (4 bits) entered. */ -int hexstring_to_u96(uint32_t* hi2, uint32_t* hi, uint32_t* lo, const char* str) { +int hexstring_to_u96(uint32_t *hi2, uint32_t *hi, uint32_t *lo, const char *str) { int n = 0, i = 0; - while (sscanf(&str[i++], "%1x", &n ) == 1) { + while (sscanf(&str[i++], "%1x", &n) == 1) { *hi2 = (*hi2 << 4) | (*hi >> 28); *hi = (*hi << 4) | (*lo >> 28); *lo = (*lo << 4) | (n & 0xf); diff --git a/client/util.h b/client/util.h index df69493d2..7d6c6460e 100644 --- a/client/util.h +++ b/client/util.h @@ -98,5 +98,5 @@ void clean_ascii(unsigned char *buf, size_t len); void strcleanrn(char *buf, size_t len); void strcreplace(char *buf, size_t len, char from, char to); char *strmcopy(const char *buf); -int hexstring_to_u96(uint32_t* hi2, uint32_t* hi, uint32_t* lo, const char* str); +int hexstring_to_u96(uint32_t *hi2, uint32_t *hi, uint32_t *lo, const char *str); #endif diff --git a/client/wiegand_formats.c b/client/wiegand_formats.c index 7228abd82..4e2541cbd 100644 --- a/client/wiegand_formats.c +++ b/client/wiegand_formats.c @@ -9,574 +9,574 @@ //----------------------------------------------------------------------------- #include "wiegand_formats.h" -bool Pack_H10301(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 26; // Set number of bits - packed->Bot |= (card->CardNumber & 0xFFFF) << 1; - 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); +bool Pack_H10301(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0xFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 26; // Set number of bits + packed->Bot |= (card->CardNumber & 0xFFFF) << 1; + 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); } -bool Unpack_H10301(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - if (packed->Length != 26) return false; // Wrong length? Stop here. - - card->CardNumber = (packed->Bot >> 1) & 0xFFFF; - card->FacilityCode = (packed->Bot >> 17) & 0xFF; - card->ParityValid = - (oddparity32((packed->Bot >> 1) & 0xFFF) == (packed->Bot & 1)) && - ((evenparity32((packed->Bot >> 13) & 0xFFF) & 1) == ((packed->Bot >> 25) & 1)); - return true; +bool Unpack_H10301(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + if (packed->Length != 26) return false; // Wrong length? Stop here. + + card->CardNumber = (packed->Bot >> 1) & 0xFFFF; + card->FacilityCode = (packed->Bot >> 17) & 0xFF; + card->ParityValid = + (oddparity32((packed->Bot >> 1) & 0xFFF) == (packed->Bot & 1)) && + ((evenparity32((packed->Bot >> 13) & 0xFFF) & 1) == ((packed->Bot >> 25) & 1)); + return true; } -bool Pack_Tecom27(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x7FF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - 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); +bool Pack_Tecom27(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x7FF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + 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); } -bool Unpack_Tecom27(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 27) return false; // Wrong length? Stop here. - - card->CardNumber = get_nonlinear_field(packed, 16, (uint8_t[]){0, 1, 13, 12, 9, 26, 20, 16, 17, 21, 25, 7, 8, 11, 4, 5}); - card->FacilityCode = get_nonlinear_field(packed, 10, (uint8_t[]){15, 19, 24, 23, 22, 18, 6, 10, 14, 3, 2}); - return true; +bool Unpack_Tecom27(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 27) return false; // Wrong length? Stop here. + + card->CardNumber = get_nonlinear_field(packed, 16, (uint8_t[]) {0, 1, 13, 12, 9, 26, 20, 16, 17, 21, 25, 7, 8, 11, 4, 5}); + card->FacilityCode = get_nonlinear_field(packed, 10, (uint8_t[]) {15, 19, 24, 23, 22, 18, 6, 10, 14, 3, 2}); + return true; } -bool Pack_2804W(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x0FF) return false; // Can't encode FC. - if (card->CardNumber > 0x7FFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 28; - set_linear_field(packed, card->FacilityCode, 4, 8); - set_linear_field(packed, card->CardNumber, 12, 15); - set_bit_by_position(packed, - oddparity32(get_nonlinear_field(packed, 16, (uint8_t[]){4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26})) +bool Pack_2804W(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x0FF) return false; // Can't encode FC. + if (card->CardNumber > 0x7FFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 28; + set_linear_field(packed, card->FacilityCode, 4, 8); + set_linear_field(packed, card->CardNumber, 12, 15); + set_bit_by_position(packed, + oddparity32(get_nonlinear_field(packed, 16, (uint8_t[]) {4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26})) , 2); - set_bit_by_position(packed, - evenparity32(get_linear_field(packed, 1, 13)) - , 0); - set_bit_by_position(packed, - oddparity32(get_linear_field(packed, 0, 27)) - , 27); - return add_HID_header(packed); + set_bit_by_position(packed, + evenparity32(get_linear_field(packed, 1, 13)) + , 0); + set_bit_by_position(packed, + oddparity32(get_linear_field(packed, 0, 27)) + , 27); + return add_HID_header(packed); } -bool Unpack_2804W(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 28) return false; // Wrong length? Stop here. - - card->FacilityCode = get_linear_field(packed, 4, 8); - card->CardNumber = get_linear_field(packed, 12, 15); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 13))) && - (get_bit_by_position(packed, 2) == oddparity32(get_nonlinear_field(packed, 16, (uint8_t[]){4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26}))) && +bool Unpack_2804W(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 28) return false; // Wrong length? Stop here. + + card->FacilityCode = get_linear_field(packed, 4, 8); + card->CardNumber = get_linear_field(packed, 12, 15); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 13))) && + (get_bit_by_position(packed, 2) == oddparity32(get_nonlinear_field(packed, 16, (uint8_t[]) {4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26}))) && (get_bit_by_position(packed, 27) == oddparity32(get_linear_field(packed, 0, 27))); - return true; + return true; } -bool Pack_ATSW30(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 30; - set_linear_field(packed, card->FacilityCode, 1, 12); - set_linear_field(packed, card->CardNumber, 13, 16); - set_bit_by_position(packed, - evenparity32(get_linear_field(packed, 1, 12)) - , 0); - set_bit_by_position(packed, - oddparity32(get_linear_field(packed, 13, 16)) - , 29); - return add_HID_header(packed); +bool Pack_ATSW30(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 30; + set_linear_field(packed, card->FacilityCode, 1, 12); + set_linear_field(packed, card->CardNumber, 13, 16); + set_bit_by_position(packed, + evenparity32(get_linear_field(packed, 1, 12)) + , 0); + set_bit_by_position(packed, + oddparity32(get_linear_field(packed, 13, 16)) + , 29); + return add_HID_header(packed); } -bool Unpack_ATSW30(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 30) return false; // Wrong length? Stop here. - - card->FacilityCode = get_linear_field(packed, 1, 12); - card->CardNumber = get_linear_field(packed, 13, 16); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 12))) && - (get_bit_by_position(packed, 29) == oddparity32(get_linear_field(packed, 13, 16))); - return true; +bool Unpack_ATSW30(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 30) return false; // Wrong length? Stop here. + + card->FacilityCode = get_linear_field(packed, 1, 12); + card->CardNumber = get_linear_field(packed, 13, 16); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 12))) && + (get_bit_by_position(packed, 29) == oddparity32(get_linear_field(packed, 13, 16))); + return true; } -bool Pack_ADT31(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x0F) return false; // Can't encode FC. - if (card->CardNumber > 0x7FFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 31; - 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); +bool Pack_ADT31(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x0F) return false; // Can't encode FC. + if (card->CardNumber > 0x7FFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 31; + 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); } -bool Unpack_ADT31(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 31) return false; // Wrong length? Stop here. - card->FacilityCode = get_linear_field(packed, 1, 4); - card->CardNumber = get_linear_field(packed, 5, 23); - return true; +bool Unpack_ADT31(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 31) return false; // Wrong length? Stop here. + card->FacilityCode = get_linear_field(packed, 1, 4); + card->CardNumber = get_linear_field(packed, 5, 23); + return true; } -bool Pack_Kastle(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x00FF) return false; // Can't encode FC. - if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0x001F) return false; // IL is only 5 bits. - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 32; // Set number of bits - set_bit_by_position(packed, 1, 1); // Always 1 - set_linear_field(packed, card->IssueLevel, 2, 5); - set_linear_field(packed, card->FacilityCode, 7, 8); - 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); +bool Pack_Kastle(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x00FF) return false; // Can't encode FC. + if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0x001F) return false; // IL is only 5 bits. + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 32; // Set number of bits + set_bit_by_position(packed, 1, 1); // Always 1 + set_linear_field(packed, card->IssueLevel, 2, 5); + set_linear_field(packed, card->FacilityCode, 7, 8); + 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); } -bool Unpack_Kastle(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 32) return false; // Wrong length? Stop here. - if (get_bit_by_position(packed, 1) != 1) return false; // Always 1 in this format - - card->IssueLevel = get_linear_field(packed, 2, 5); - card->FacilityCode = get_linear_field(packed, 7, 8); - card->CardNumber = get_linear_field(packed, 15, 16); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 16))) && - (get_bit_by_position(packed, 31) == oddparity32(get_linear_field(packed, 14, 17))); - return true; +bool Unpack_Kastle(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 32) return false; // Wrong length? Stop here. + if (get_bit_by_position(packed, 1) != 1) return false; // Always 1 in this format + + card->IssueLevel = get_linear_field(packed, 2, 5); + card->FacilityCode = get_linear_field(packed, 7, 8); + card->CardNumber = get_linear_field(packed, 15, 16); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 16))) && + (get_bit_by_position(packed, 31) == oddparity32(get_linear_field(packed, 14, 17))); + return true; } -bool Pack_D10202(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x007F) return false; // Can't encode FC. - if (card->CardNumber > 0x00FFFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 33; // Set number of bits - set_linear_field(packed, card->FacilityCode, 1, 7); - 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); +bool Pack_D10202(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x007F) return false; // Can't encode FC. + if (card->CardNumber > 0x00FFFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 33; // Set number of bits + set_linear_field(packed, card->FacilityCode, 1, 7); + 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); } -bool Unpack_D10202(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 33) return false; // Wrong length? Stop here. - - card->CardNumber = get_linear_field(packed, 8, 24); - card->FacilityCode = get_linear_field(packed, 1, 7); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 16))) && - (get_bit_by_position(packed, 32) == oddparity32(get_linear_field(packed, 16, 16))); - return true; +bool Unpack_D10202(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 33) return false; // Wrong length? Stop here. + + card->CardNumber = get_linear_field(packed, 8, 24); + card->FacilityCode = get_linear_field(packed, 1, 7); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 16))) && + (get_bit_by_position(packed, 32) == oddparity32(get_linear_field(packed, 16, 16))); + return true; } -bool Pack_H10306(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFFFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 34; // Set number of bits - packed->Bot |= (card->CardNumber & 0xFFFF) << 1; - packed->Bot |= (card->FacilityCode & 0x7FFF) << 17; - 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); +bool Pack_H10306(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0xFFFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 34; // Set number of bits + packed->Bot |= (card->CardNumber & 0xFFFF) << 1; + packed->Bot |= (card->FacilityCode & 0x7FFF) << 17; + 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); } -bool Unpack_H10306(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 34) return false; // Wrong length? Stop here. - - card->CardNumber = (packed->Bot >> 1) & 0xFFFF; - card->FacilityCode = ((packed->Mid & 1) << 15) | ((packed->Bot >> 17) & 0xFF); - card->ParityValid = - ((evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xFFFE0000)) & 1) == ((packed->Mid >> 1) & 1)) && - ((oddparity32(packed->Bot & 0x0001FFFE) & 1) == ((packed->Bot & 1))); - return true; +bool Unpack_H10306(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 34) return false; // Wrong length? Stop here. + + card->CardNumber = (packed->Bot >> 1) & 0xFFFF; + card->FacilityCode = ((packed->Mid & 1) << 15) | ((packed->Bot >> 17) & 0xFF); + card->ParityValid = + ((evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xFFFE0000)) & 1) == ((packed->Mid >> 1) & 1)) && + ((oddparity32(packed->Bot & 0x0001FFFE) & 1) == ((packed->Bot & 1))); + return true; } -bool Pack_N10002(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - 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); +bool Pack_N10002(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0xFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + 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); } -bool Unpack_N10002(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 34) return false; // Wrong length? Stop here. - - card->CardNumber = get_linear_field(packed, 17, 16); - card->FacilityCode = get_linear_field(packed, 9, 8); - return true; +bool Unpack_N10002(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 34) return false; // Wrong length? Stop here. + + card->CardNumber = get_linear_field(packed, 17, 16); + card->FacilityCode = get_linear_field(packed, 9, 8); + return true; } -bool Pack_C1k35s(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format +bool Pack_C1k35s(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); - packed->Length = 35; // Set number of bits - packed->Bot |= (card->CardNumber & 0x000FFFFF) << 1; - packed->Bot |= (card->FacilityCode & 0x000007FF) << 21; - packed->Mid |= (card->FacilityCode & 0x00000800) >> 11; - 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 (card->FacilityCode > 0xFFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 35; // Set number of bits + packed->Bot |= (card->CardNumber & 0x000FFFFF) << 1; + packed->Bot |= (card->FacilityCode & 0x000007FF) << 21; + packed->Mid |= (card->FacilityCode & 0x00000800) >> 11; + 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); } -bool Unpack_C1k35s(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 35) return false; // Wrong length? Stop here. - - card->CardNumber = (packed->Bot >> 1) & 0x000FFFFF; - card->FacilityCode = ((packed->Mid & 1) << 11) | ((packed->Bot >> 21)); - card->ParityValid = - (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xB6DB6DB6)) == ((packed->Mid >> 1) & 1)) && - ( oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0x6DB6DB6C)) == ((packed->Bot >> 0) & 1)) && - ( oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0xFFFFFFFF)) == ((packed->Mid >> 2) & 1)); - return true; +bool Unpack_C1k35s(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 35) return false; // Wrong length? Stop here. + + card->CardNumber = (packed->Bot >> 1) & 0x000FFFFF; + card->FacilityCode = ((packed->Mid & 1) << 11) | ((packed->Bot >> 21)); + card->ParityValid = + (evenparity32((packed->Mid & 0x00000001) ^ (packed->Bot & 0xB6DB6DB6)) == ((packed->Mid >> 1) & 1)) && + (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0x6DB6DB6C)) == ((packed->Bot >> 0) & 1)) && + (oddparity32((packed->Mid & 0x00000003) ^ (packed->Bot & 0xFFFFFFFF)) == ((packed->Mid >> 2) & 1)); + return true; } -bool Pack_H10320(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) - if (card->CardNumber > 99999999) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 36; // Set number of bits - // This card is BCD-encoded rather than binary. Set the 4-bit groups independently. - for (uint32_t idx = 0; idx < 8; idx++){ - set_linear_field(packed, (uint64_t)(card->CardNumber / pow(10, 7-idx)) % 10, idx * 4, 4); - } - set_bit_by_position(packed, evenparity32( - get_nonlinear_field(packed, 8, (uint8_t[]){0, 4, 8, 12, 16, 20, 24, 28}) - ), 32); - set_bit_by_position(packed, oddparity32( - get_nonlinear_field(packed, 8, (uint8_t[]){1, 5, 9, 13, 17, 21, 25, 29}) - ), 33); - set_bit_by_position(packed, evenparity32( - get_nonlinear_field(packed, 8, (uint8_t[]){2, 6, 10, 14, 18, 22, 28, 30}) - ), 34); - 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); -} +bool Pack_H10320(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); -bool Unpack_H10320(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. - - // This card is BCD-encoded rather than binary. Get the 4-bit groups independently. - for (uint32_t idx = 0; idx < 8; idx++){ - uint64_t val = get_linear_field(packed, idx * 4, 4); - if (val > 9){ - // Violation of BCD; Zero and exit. - card->CardNumber = 0; - return false; - } else { - card->CardNumber += val * pow(10, 7-idx); + if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) + if (card->CardNumber > 99999999) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 36; // Set number of bits + // This card is BCD-encoded rather than binary. Set the 4-bit groups independently. + for (uint32_t idx = 0; idx < 8; idx++) { + set_linear_field(packed, (uint64_t)(card->CardNumber / pow(10, 7 - idx)) % 10, idx * 4, 4); } - } - card->ParityValid = - (get_bit_by_position(packed, 32) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]){0, 4, 8, 12, 16, 20, 24, 28}))) && - (get_bit_by_position(packed, 33) == oddparity32(get_nonlinear_field(packed, 8, (uint8_t[]){1, 5, 9, 13, 17, 21, 25, 29}))) && - (get_bit_by_position(packed, 34) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]){2, 6, 10, 14, 18, 22, 28, 30}))) && - (get_bit_by_position(packed, 35) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]){3, 7, 11, 15, 19, 23, 29, 31}))); - return true; + set_bit_by_position(packed, evenparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {0, 4, 8, 12, 16, 20, 24, 28}) + ), 32); + set_bit_by_position(packed, oddparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {1, 5, 9, 13, 17, 21, 25, 29}) + ), 33); + set_bit_by_position(packed, evenparity32( + get_nonlinear_field(packed, 8, (uint8_t[]) {2, 6, 10, 14, 18, 22, 28, 30}) + ), 34); + 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); } -bool Pack_S12906(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0xFF) return false; // Can't encode FC. - if (card->IssueLevel > 0x03) return false; // Can't encode IL. - if (card->CardNumber > 0x00FFFFFF) return false; // Can't encode CN. - if (card->OEM > 0) return false; // Not used in this format +bool Unpack_H10320(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); - packed->Length = 36; // Set number of bits - set_linear_field(packed, card->FacilityCode, 1, 8); - set_linear_field(packed, card->IssueLevel, 9, 2); - 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 (packed->Length != 36) return false; // Wrong length? Stop here. + + // This card is BCD-encoded rather than binary. Get the 4-bit groups independently. + for (uint32_t idx = 0; idx < 8; idx++) { + uint64_t val = get_linear_field(packed, idx * 4, 4); + if (val > 9) { + // Violation of BCD; Zero and exit. + card->CardNumber = 0; + return false; + } else { + card->CardNumber += val * pow(10, 7 - idx); + } + } + card->ParityValid = + (get_bit_by_position(packed, 32) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]) {0, 4, 8, 12, 16, 20, 24, 28}))) && + (get_bit_by_position(packed, 33) == oddparity32(get_nonlinear_field(packed, 8, (uint8_t[]) {1, 5, 9, 13, 17, 21, 25, 29}))) && + (get_bit_by_position(packed, 34) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]) {2, 6, 10, 14, 18, 22, 28, 30}))) && + (get_bit_by_position(packed, 35) == evenparity32(get_nonlinear_field(packed, 8, (uint8_t[]) {3, 7, 11, 15, 19, 23, 29, 31}))); + return true; } -bool Unpack_S12906(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. - - card->FacilityCode = get_linear_field(packed, 1, 8); - card->IssueLevel = get_linear_field(packed, 9, 2); - card->CardNumber = get_linear_field(packed, 11, 24); - card->ParityValid = - (get_bit_by_position(packed, 0) == oddparity32(get_linear_field(packed, 1, 17))) && - (get_bit_by_position(packed, 35) == oddparity32(get_linear_field(packed, 17, 18))); - return true; +bool Pack_S12906(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0xFF) return false; // Can't encode FC. + if (card->IssueLevel > 0x03) return false; // Can't encode IL. + if (card->CardNumber > 0x00FFFFFF) return false; // Can't encode CN. + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 36; // Set number of bits + set_linear_field(packed, card->FacilityCode, 1, 8); + set_linear_field(packed, card->IssueLevel, 9, 2); + 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); } -bool Pack_Sie36(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x0003FFFF) return false; // Can't encode FC. - if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 36; // Set number of bits - set_linear_field(packed, card->FacilityCode, 1, 18); - set_linear_field(packed, card->CardNumber, 19, 16); - set_bit_by_position(packed, - oddparity32(get_nonlinear_field(packed, 23, (uint8_t[]){1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34})) - , 0); - 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); +bool Unpack_S12906(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. + + card->FacilityCode = get_linear_field(packed, 1, 8); + card->IssueLevel = get_linear_field(packed, 9, 2); + card->CardNumber = get_linear_field(packed, 11, 24); + card->ParityValid = + (get_bit_by_position(packed, 0) == oddparity32(get_linear_field(packed, 1, 17))) && + (get_bit_by_position(packed, 35) == oddparity32(get_linear_field(packed, 17, 18))); + return true; } -bool Unpack_Sie36(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); +bool Pack_Sie36(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); - if (packed->Length != 36) return false; // Wrong length? Stop here. + if (card->FacilityCode > 0x0003FFFF) return false; // Can't encode FC. + if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format - card->FacilityCode = get_linear_field(packed, 1, 18); - card->CardNumber = get_linear_field(packed, 19, 16); - card->ParityValid = - (get_bit_by_position(packed, 0) == oddparity32(get_nonlinear_field(packed, 23, (uint8_t[]){1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34}))) && - (get_bit_by_position(packed, 35) == oddparity32(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}))); - return true; + packed->Length = 36; // Set number of bits + set_linear_field(packed, card->FacilityCode, 1, 18); + set_linear_field(packed, card->CardNumber, 19, 16); + set_bit_by_position(packed, + oddparity32(get_nonlinear_field(packed, 23, (uint8_t[]) {1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34})) + , 0); + 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); } -bool Pack_C15001(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x000000FF) return false; // Can't encode FC. - if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0x000003FF) return false; // Can't encode OEM. - - packed->Length = 36; // Set number of bits - set_linear_field(packed, card->OEM, 1, 10); - set_linear_field(packed, card->FacilityCode, 11, 8); - 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); +bool Unpack_Sie36(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. + + card->FacilityCode = get_linear_field(packed, 1, 18); + card->CardNumber = get_linear_field(packed, 19, 16); + card->ParityValid = + (get_bit_by_position(packed, 0) == oddparity32(get_nonlinear_field(packed, 23, (uint8_t[]) {1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34}))) && + (get_bit_by_position(packed, 35) == oddparity32(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}))); + return true; } -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. - - card->OEM = get_linear_field(packed, 1, 10); - card->FacilityCode = get_linear_field(packed, 11, 8); - card->CardNumber = get_linear_field(packed, 19, 16); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 17))) && - (get_bit_by_position(packed, 35) == oddparity32(get_linear_field(packed, 18, 17))); - return true; +bool Pack_C15001(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0x000000FF) return false; // Can't encode FC. + if (card->CardNumber > 0x0000FFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0x000003FF) return false; // Can't encode OEM. + + packed->Length = 36; // Set number of bits + set_linear_field(packed, card->OEM, 1, 10); + set_linear_field(packed, card->FacilityCode, 11, 8); + 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); } -bool Pack_H10302(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) - if (card->CardNumber > 0x00000007FFFFFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format +bool Unpack_C15001(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); - packed->Length = 37; // Set number of bits - 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 (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); + card->CardNumber = get_linear_field(packed, 19, 16); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 17))) && + (get_bit_by_position(packed, 35) == oddparity32(get_linear_field(packed, 18, 17))); + return true; } -bool Unpack_H10302(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); - - if (packed->Length != 37) return false; // Wrong length? Stop here. - - card->CardNumber = get_linear_field(packed, 1, 35); - card->ParityValid = - (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 18))) && - (get_bit_by_position(packed, 36) == oddparity32(get_linear_field(packed, 18, 18))); - return true; +bool Pack_H10302(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (card->FacilityCode > 0) return false; // Can't encode FC. (none in this format) + if (card->CardNumber > 0x00000007FFFFFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 37; // Set number of bits + 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); } -bool Pack_H10304(wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC. - if (card->CardNumber > 0x0007FFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 37; // Set number of bits - packed->Bot |= (card->CardNumber & 0x0007FFFF) << 1; - packed->Bot |= (card->FacilityCode & 0x00000FFF) << 20; - packed->Mid |= (card->FacilityCode & 0x0000F000) >> 12; - packed->Mid |= (evenparity32((packed->Mid & 0x0000000F) ^ (packed->Bot & 0xFFFC0000)) & 1) << 4; - packed->Bot |= ( oddparity32(packed->Bot & 0x0007FFFE) & 1); - return add_HID_header(packed); +bool Unpack_H10302(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 37) return false; // Wrong length? Stop here. + + card->CardNumber = get_linear_field(packed, 1, 35); + card->ParityValid = + (get_bit_by_position(packed, 0) == evenparity32(get_linear_field(packed, 1, 18))) && + (get_bit_by_position(packed, 36) == oddparity32(get_linear_field(packed, 18, 18))); + return true; } -bool Unpack_H10304(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); +bool Pack_H10304(wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); - if (packed->Length != 37) return false; // Wrong length? Stop here. + if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC. + if (card->CardNumber > 0x0007FFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format - card->CardNumber = (packed->Bot >> 1) & 0x0007FFFF; - card->FacilityCode = ((packed->Mid & 0xF) << 12) | ((packed->Bot >> 20)); - card->ParityValid = - (evenparity32((packed->Mid & 0x0000000F) ^ (packed->Bot & 0xFFFC0000)) == ((packed->Mid >> 4) & 1)) && - (oddparity32( packed->Bot & 0x0007FFFE) == (packed->Bot & 1)); - return true; + packed->Length = 37; // Set number of bits + packed->Bot |= (card->CardNumber & 0x0007FFFF) << 1; + packed->Bot |= (card->FacilityCode & 0x00000FFF) << 20; + packed->Mid |= (card->FacilityCode & 0x0000F000) >> 12; + packed->Mid |= (evenparity32((packed->Mid & 0x0000000F) ^ (packed->Bot & 0xFFFC0000)) & 1) << 4; + packed->Bot |= (oddparity32(packed->Bot & 0x0007FFFE) & 1); + return add_HID_header(packed); } -bool Pack_P10001(wiegand_card_t* card, wiegand_message_t* packed){ +bool Unpack_H10304(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); - memset(packed, 0, sizeof(wiegand_message_t)); + if (packed->Length != 37) return false; // Wrong length? Stop here. - if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. - if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format - - packed->Length = 40; // Set number of bits - set_linear_field(packed, 0xF, 0, 4); - set_linear_field(packed, card->FacilityCode, 4, 12); - set_linear_field(packed, card->CardNumber, 16, 16); - set_linear_field(packed, - get_linear_field(packed, 0, 8) ^ - get_linear_field(packed, 8, 8) ^ - get_linear_field(packed, 16, 8) ^ - get_linear_field(packed, 24, 8) - , 32, 8); - return add_HID_header(packed); + card->CardNumber = (packed->Bot >> 1) & 0x0007FFFF; + card->FacilityCode = ((packed->Mid & 0xF) << 12) | ((packed->Bot >> 20)); + card->ParityValid = + (evenparity32((packed->Mid & 0x0000000F) ^ (packed->Bot & 0xFFFC0000)) == ((packed->Mid >> 4) & 1)) && + (oddparity32(packed->Bot & 0x0007FFFE) == (packed->Bot & 1)); + return true; } -bool Unpack_P10001(wiegand_message_t* packed, wiegand_card_t* card){ +bool Pack_P10001(wiegand_card_t *card, wiegand_message_t *packed) { - memset(card, 0, sizeof(wiegand_card_t)); + memset(packed, 0, sizeof(wiegand_message_t)); - if (packed->Length != 40) return false; // Wrong length? Stop here. + if (card->FacilityCode > 0xFFF) return false; // Can't encode FC. + if (card->CardNumber > 0xFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format - card->CardNumber = get_linear_field(packed, 16, 16); - card->FacilityCode = get_linear_field(packed, 4, 12); - card->ParityValid = ( - get_linear_field(packed, 0, 8) ^ - get_linear_field(packed, 8, 8) ^ - get_linear_field(packed, 16, 8) ^ - get_linear_field(packed, 24, 8) - ) == get_linear_field(packed, 32, 8); - return true; + packed->Length = 40; // Set number of bits + set_linear_field(packed, 0xF, 0, 4); + set_linear_field(packed, card->FacilityCode, 4, 12); + set_linear_field(packed, card->CardNumber, 16, 16); + set_linear_field(packed, + get_linear_field(packed, 0, 8) ^ + get_linear_field(packed, 8, 8) ^ + get_linear_field(packed, 16, 8) ^ + get_linear_field(packed, 24, 8) + , 32, 8); + return add_HID_header(packed); } -bool Pack_C1k48s(wiegand_card_t* card, wiegand_message_t* packed){ +bool Unpack_P10001(wiegand_message_t *packed, wiegand_card_t *card) { - memset(packed, 0, sizeof(wiegand_message_t)); + memset(card, 0, sizeof(wiegand_card_t)); - if (card->FacilityCode > 0x003FFFFF) return false; // Can't encode FC. - if (card->CardNumber > 0x007FFFFF) return false; // Can't encode CN. - if (card->IssueLevel > 0) return false; // Not used in this format - if (card->OEM > 0) return false; // Not used in this format + if (packed->Length != 40) return false; // Wrong length? Stop here. - packed->Length = 48; // Set number of bits - packed->Bot |= (card->CardNumber & 0x007FFFFF) << 1; - packed->Bot |= (card->FacilityCode & 0x000000FF) << 24; - packed->Mid |= (card->FacilityCode & 0x003FFF00) >> 8; - 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); + card->CardNumber = get_linear_field(packed, 16, 16); + card->FacilityCode = get_linear_field(packed, 4, 12); + card->ParityValid = ( + get_linear_field(packed, 0, 8) ^ + get_linear_field(packed, 8, 8) ^ + get_linear_field(packed, 16, 8) ^ + get_linear_field(packed, 24, 8) + ) == get_linear_field(packed, 32, 8); + return true; } -bool Unpack_C1k48s(wiegand_message_t* packed, wiegand_card_t* card){ - memset(card, 0, sizeof(wiegand_card_t)); +bool Pack_C1k48s(wiegand_card_t *card, wiegand_message_t *packed) { - if (packed->Length != 48) return false; // Wrong length? Stop here. + memset(packed, 0, sizeof(wiegand_message_t)); - card->CardNumber = (packed->Bot >> 1) & 0x007FFFFF; - card->FacilityCode = ((packed->Mid & 0x00003FFF) << 8) | ((packed->Bot >> 24)); - card->ParityValid = - (evenparity32((packed->Mid & 0x00001B6D) ^ (packed->Bot & 0xB6DB6DB6)) == ((packed->Mid >> 14) & 1)) && - ( oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C)) == ((packed->Bot >> 0) & 1)) && - ( oddparity32((packed->Mid & 0x00007FFF) ^ (packed->Bot & 0xFFFFFFFF)) == ((packed->Mid >> 15) & 1)); - return true; + if (card->FacilityCode > 0x003FFFFF) return false; // Can't encode FC. + if (card->CardNumber > 0x007FFFFF) return false; // Can't encode CN. + if (card->IssueLevel > 0) return false; // Not used in this format + if (card->OEM > 0) return false; // Not used in this format + + packed->Length = 48; // Set number of bits + packed->Bot |= (card->CardNumber & 0x007FFFFF) << 1; + packed->Bot |= (card->FacilityCode & 0x000000FF) << 24; + packed->Mid |= (card->FacilityCode & 0x003FFF00) >> 8; + 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); +} + +bool Unpack_C1k48s(wiegand_message_t *packed, wiegand_card_t *card) { + memset(card, 0, sizeof(wiegand_card_t)); + + if (packed->Length != 48) return false; // Wrong length? Stop here. + + card->CardNumber = (packed->Bot >> 1) & 0x007FFFFF; + card->FacilityCode = ((packed->Mid & 0x00003FFF) << 8) | ((packed->Bot >> 24)); + card->ParityValid = + (evenparity32((packed->Mid & 0x00001B6D) ^ (packed->Bot & 0xB6DB6DB6)) == ((packed->Mid >> 14) & 1)) && + (oddparity32((packed->Mid & 0x000036DB) ^ (packed->Bot & 0x6DB6DB6C)) == ((packed->Bot >> 0) & 1)) && + (oddparity32((packed->Mid & 0x00007FFF) ^ (packed->Bot & 0xFFFFFFFF)) == ((packed->Mid >> 15) & 1)); + return true; } static const cardformat_t FormatTable[] = { @@ -601,7 +601,7 @@ static const cardformat_t FormatTable[] = { {NULL, NULL, NULL, NULL, {0, 0, 0, 0, 0}} // Must null terminate array }; -void HIDListFormats(){ +void HIDListFormats() { if (FormatTable[0].Name == NULL) return; @@ -617,58 +617,58 @@ void HIDListFormats(){ return; } -cardformat_t HIDGetCardFormat(int idx){ +cardformat_t HIDGetCardFormat(int idx) { return FormatTable[idx]; } int HIDFindCardFormat(const char *format) { - if (FormatTable[0].Name == NULL) + if (FormatTable[0].Name == NULL) return -1; - + int i = 0; // str_lower - + while (FormatTable[i].Name && strcmp(FormatTable[i].Name, format)) { ++i; } if (FormatTable[i].Name) return i; - + return -1; } -bool HIDPack(int format_idx, wiegand_card_t* card, wiegand_message_t* packed){ - memset(packed, 0, sizeof(wiegand_message_t)); - - if (format_idx < 0 || format_idx >= (sizeof(FormatTable) / sizeof(FormatTable[0]))) - return false; - - return FormatTable[format_idx].Pack(card, packed); +bool HIDPack(int format_idx, wiegand_card_t *card, wiegand_message_t *packed) { + memset(packed, 0, sizeof(wiegand_message_t)); + + if (format_idx < 0 || format_idx >= (sizeof(FormatTable) / sizeof(FormatTable[0]))) + return false; + + return FormatTable[format_idx].Pack(card, packed); } -void HIDDisplayUnpackedCard(wiegand_card_t* card, const cardformat_t format){ +void HIDDisplayUnpackedCard(wiegand_card_t *card, const cardformat_t format) { -/* - PrintAndLogEx(SUCCESS, " Format: %s (%s)", format.Name, format.Descrp); + /* + PrintAndLogEx(SUCCESS, " Format: %s (%s)", format.Name, format.Descrp); - if (format.Fields.hasFacilityCode) - PrintAndLogEx(SUCCESS, "Facility Code: %d",card->FacilityCode); + if (format.Fields.hasFacilityCode) + PrintAndLogEx(SUCCESS, "Facility Code: %d",card->FacilityCode); - if (format.Fields.hasCardNumber) - PrintAndLogEx(SUCCESS, " Card Number: %d",card->CardNumber); + if (format.Fields.hasCardNumber) + PrintAndLogEx(SUCCESS, " Card Number: %d",card->CardNumber); - if (format.Fields.hasIssueLevel) - PrintAndLogEx(SUCCESS, " Issue Level: %d",card->IssueLevel); + if (format.Fields.hasIssueLevel) + PrintAndLogEx(SUCCESS, " Issue Level: %d",card->IssueLevel); - if (format.Fields.hasOEMCode) - PrintAndLogEx(SUCCESS, " OEM Code: %d",card->OEM); + if (format.Fields.hasOEMCode) + PrintAndLogEx(SUCCESS, " OEM Code: %d",card->OEM); - if (format.Fields.hasParity) - PrintAndLogEx(SUCCESS, " Parity: %s",card->ParityValid ? "Valid" : "Invalid"); -*/ + if (format.Fields.hasParity) + PrintAndLogEx(SUCCESS, " Parity: %s",card->ParityValid ? "Valid" : "Invalid"); + */ char s[80] = {0}; if (format.Fields.hasFacilityCode) @@ -681,23 +681,23 @@ void HIDDisplayUnpackedCard(wiegand_card_t* card, const cardformat_t format){ snprintf(s + strlen(s), sizeof(s) - strlen(s), " Issue %d", card->IssueLevel); if (format.Fields.hasOEMCode) - snprintf(s + strlen(s), sizeof(s) - strlen(s), " OEM: %d",card->OEM); + snprintf(s + strlen(s), sizeof(s) - strlen(s), " OEM: %d", card->OEM); if (format.Fields.hasParity) snprintf(s + strlen(s), sizeof(s) - strlen(s), " parity: %s", card->ParityValid ? "valid" : "invalid"); - + PrintAndLogEx(SUCCESS, "%s [%s - %s]", s, format.Name, format.Descrp); } -bool HIDTryUnpack(wiegand_message_t* packed, bool ignore_parity){ - if (FormatTable[0].Name == NULL) +bool HIDTryUnpack(wiegand_message_t *packed, bool ignore_parity) { + if (FormatTable[0].Name == NULL) return false; bool result = false; int i = 0; wiegand_card_t card; memset(&card, 0, sizeof(wiegand_card_t)); - + while (FormatTable[i].Name) { if (FormatTable[i].Unpack(packed, &card)) { if (ignore_parity || !FormatTable[i].Fields.hasParity || card.ParityValid) { @@ -707,9 +707,9 @@ bool HIDTryUnpack(wiegand_message_t* packed, bool ignore_parity){ } ++i; } - if ( result == false ) { + if (result == false) { PrintAndLogEx(SUCCESS, "Unknown. Bit len %d", packed->Length); } - + return result; } diff --git a/client/wiegand_formats.h b/client/wiegand_formats.h index 102c2b0cb..e3aca4b9c 100644 --- a/client/wiegand_formats.h +++ b/client/wiegand_formats.h @@ -23,26 +23,26 @@ #include "ui.h" typedef struct { - bool hasCardNumber; - bool hasFacilityCode; - bool hasIssueLevel; - bool hasOEMCode; - bool hasParity; + bool hasCardNumber; + bool hasFacilityCode; + bool hasIssueLevel; + bool hasOEMCode; + bool hasParity; } cardformatdescriptor_t; // 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 (*Unpack)(wiegand_message_t* packed, wiegand_card_t* card); - const char* Descrp; - cardformatdescriptor_t Fields; + const char *Name; + bool (*Pack)(wiegand_card_t *card, wiegand_message_t *packed); + bool (*Unpack)(wiegand_message_t *packed, wiegand_card_t *card); + const char *Descrp; + cardformatdescriptor_t Fields; } cardformat_t; void HIDListFormats(); int HIDFindCardFormat(const char *format); cardformat_t HIDGetCardFormat(int idx); -bool HIDPack(int FormatIndex, wiegand_card_t* card, wiegand_message_t* packed); -bool HIDTryUnpack(wiegand_message_t* packed, bool ignoreParity); +bool HIDPack(int FormatIndex, wiegand_card_t *card, wiegand_message_t *packed); +bool HIDTryUnpack(wiegand_message_t *packed, bool ignoreParity); #endif diff --git a/client/wiegand_formatutils.c b/client/wiegand_formatutils.c index dd3678daf..a4529955d 100644 --- a/client/wiegand_formatutils.c +++ b/client/wiegand_formatutils.c @@ -15,171 +15,171 @@ #include "wiegand_formatutils.h" #include "ui.h" -bool get_bit_by_position(wiegand_message_t* data, uint8_t pos){ - if (pos >= data->Length) return false; - pos = (data->Length - pos) - 1; // invert ordering; Indexing goes from 0 to 1. Subtract 1 for weight of bit. - bool result = false; - if (pos > 95) - result = false; - else if (pos > 63) - result = (data->Top >> (pos - 64)) & 1; - else if (pos > 31) - result = (data->Mid >> (pos - 32)) & 1; - else - result = (data->Bot >> pos) & 1; - return result; +bool get_bit_by_position(wiegand_message_t *data, uint8_t pos) { + if (pos >= data->Length) return false; + pos = (data->Length - pos) - 1; // invert ordering; Indexing goes from 0 to 1. Subtract 1 for weight of bit. + bool result = false; + if (pos > 95) + result = false; + else if (pos > 63) + result = (data->Top >> (pos - 64)) & 1; + else if (pos > 31) + result = (data->Mid >> (pos - 32)) & 1; + else + result = (data->Bot >> pos) & 1; + return result; } -bool set_bit_by_position(wiegand_message_t* data, bool value, uint8_t pos){ - if (pos >= data->Length) return false; - pos = (data->Length - pos) - 1; // invert ordering; Indexing goes from 0 to 1. Subtract 1 for weight of bit. - if (pos > 95) { - return false; - } else if (pos > 63) { - if (value) - data->Top |= (1 << (pos - 64)); - else - data->Top &= ~(1 << (pos - 64)); - return true; - } else if (pos > 31) { - if (value) - data->Mid |= (1 << (pos - 32)); - else - data->Mid &= ~(1 << (pos - 32)); - return true; - } else { - if (value) - data->Bot |= (1 << pos); - else - data->Bot &= ~(1 << pos); - return true; - } +bool set_bit_by_position(wiegand_message_t *data, bool value, uint8_t pos) { + if (pos >= data->Length) return false; + pos = (data->Length - pos) - 1; // invert ordering; Indexing goes from 0 to 1. Subtract 1 for weight of bit. + if (pos > 95) { + return false; + } else if (pos > 63) { + if (value) + data->Top |= (1 << (pos - 64)); + else + data->Top &= ~(1 << (pos - 64)); + return true; + } else if (pos > 31) { + if (value) + data->Mid |= (1 << (pos - 32)); + else + data->Mid &= ~(1 << (pos - 32)); + return true; + } else { + if (value) + data->Bot |= (1 << pos); + else + data->Bot &= ~(1 << pos); + return true; + } } /** * Safeguard the data by doing a manual deep copy - * + * * At the time of the initial writing, the struct does not contain pointers. That doesn't * mean it won't eventually contain one, however. To prevent memory leaks and erroneous * aliasing, perform the copy function manually instead. Hence, this function. - * + * * If the definition of the wiegand_message struct changes, this function must also * be updated to match. */ -void message_datacopy(wiegand_message_t* src, wiegand_message_t* dest){ - dest->Bot = src->Bot; - dest->Mid = src->Mid; - dest->Top = src->Top; - dest->Length = src->Length; +void message_datacopy(wiegand_message_t *src, wiegand_message_t *dest) { + dest->Bot = src->Bot; + dest->Mid = src->Mid; + dest->Top = src->Top; + dest->Length = src->Length; } /** * - * Yes, this is horribly inefficient for linear data. + * Yes, this is horribly inefficient for linear data. * The current code is a temporary measure to have a working function in place * until all the bugs shaken from the block/chunk version of the code. * */ -uint64_t get_linear_field(wiegand_message_t* data, uint8_t firstBit, uint8_t length){ - uint64_t result = 0; - for (uint8_t i = 0; i < length; i++ ) { - result = (result << 1) | get_bit_by_position(data, firstBit + i); - } - return result; +uint64_t get_linear_field(wiegand_message_t *data, uint8_t firstBit, uint8_t length) { + uint64_t result = 0; + for (uint8_t i = 0; i < length; i++) { + result = (result << 1) | get_bit_by_position(data, firstBit + i); + } + return result; } -bool set_linear_field(wiegand_message_t* data, uint64_t value, uint8_t firstBit, uint8_t length){ - wiegand_message_t tmpdata; - message_datacopy(data, &tmpdata); - bool result = true; - for (int i = 0; i < length; i++){ - result &= set_bit_by_position(&tmpdata, (value >> ((length - i) - 1)) & 1, firstBit + i); - } - if (result) - message_datacopy(&tmpdata, data); - - return result; -} - -uint64_t get_nonlinear_field(wiegand_message_t* data, uint8_t numBits, uint8_t* bits){ - uint64_t result = 0; - for (int i = 0; i < numBits; i++){ - result = (result << 1) | (get_bit_by_position(data, *(bits+i)) & 1); - } - return result; -} -bool set_nonlinear_field(wiegand_message_t* data, uint64_t value, uint8_t numBits, uint8_t* bits){ - +bool set_linear_field(wiegand_message_t *data, uint64_t value, uint8_t firstBit, uint8_t length) { wiegand_message_t tmpdata; message_datacopy(data, &tmpdata); - bool result = true; - for (int i = 0; i < numBits; i++){ - result &= set_bit_by_position(&tmpdata, (value >> ((numBits - i) - 1)) & 1, *(bits + i)); + for (int i = 0; i < length; i++) { + result &= set_bit_by_position(&tmpdata, (value >> ((length - i) - 1)) & 1, firstBit + i); } - if (result) message_datacopy(&tmpdata, data); return result; } -uint8_t get_length_from_header(wiegand_message_t* data) { - uint8_t len = 0; - uint32_t hfmt = 0; // for calculating card length - - if ((data->Top & 0x000FFFFF) > 0) { // > 64 bits - hfmt = data->Top & 0x000FFFFF; - len = 64; - } else if ((data->Mid & 0xFFFFFFC0) > 0) { // < 63-38 bits - hfmt = data->Mid & 0xFFFFFFC0; - len = 32; - } else if (data->Mid && (data->Mid & 0x00000020) == 0) { // 37 bits; - hfmt = 0; - len = 37; - } else if ((data->Mid & 0x0000001F) > 0){ // 36-32 bits - printf("a\n"); - hfmt = data->Mid & 0x0000001F; - len = 32; - } else if (data->Top == 0 && data->Mid == 0) { //< 32 bits - hfmt = data->Bot; - len = 0; - } else { - hfmt = data->Bot; - len = 0; - } +uint64_t get_nonlinear_field(wiegand_message_t *data, uint8_t numBits, uint8_t *bits) { + uint64_t result = 0; + for (int i = 0; i < numBits; i++) { + result = (result << 1) | (get_bit_by_position(data, *(bits + i)) & 1); + } + return result; +} +bool set_nonlinear_field(wiegand_message_t *data, uint64_t value, uint8_t numBits, uint8_t *bits) { - while (hfmt > 1) { - hfmt >>= 1; - len++; - } - return len; + wiegand_message_t tmpdata; + message_datacopy(data, &tmpdata); + + bool result = true; + for (int i = 0; i < numBits; i++) { + result &= set_bit_by_position(&tmpdata, (value >> ((numBits - i) - 1)) & 1, *(bits + i)); + } + + if (result) + message_datacopy(&tmpdata, data); + + return result; } -wiegand_message_t initialize_message_object(uint32_t top, uint32_t mid, uint32_t bot){ - wiegand_message_t result; - memset(&result, 0, sizeof(wiegand_message_t)); - - result.Top = top; - result.Mid = mid; - result.Bot = bot; - result.Length = get_length_from_header(&result); - return result; +uint8_t get_length_from_header(wiegand_message_t *data) { + uint8_t len = 0; + uint32_t hfmt = 0; // for calculating card length + + if ((data->Top & 0x000FFFFF) > 0) { // > 64 bits + hfmt = data->Top & 0x000FFFFF; + len = 64; + } else if ((data->Mid & 0xFFFFFFC0) > 0) { // < 63-38 bits + hfmt = data->Mid & 0xFFFFFFC0; + len = 32; + } else if (data->Mid && (data->Mid & 0x00000020) == 0) { // 37 bits; + hfmt = 0; + len = 37; + } else if ((data->Mid & 0x0000001F) > 0) { // 36-32 bits + printf("a\n"); + hfmt = data->Mid & 0x0000001F; + len = 32; + } else if (data->Top == 0 && data->Mid == 0) { //< 32 bits + hfmt = data->Bot; + len = 0; + } else { + hfmt = data->Bot; + len = 0; + } + + while (hfmt > 1) { + hfmt >>= 1; + len++; + } + return len; } -bool add_HID_header(wiegand_message_t* data){ - if (data->Length > 84 || data->Length == 0) return false; // Invalid value +wiegand_message_t initialize_message_object(uint32_t top, uint32_t mid, uint32_t bot) { + wiegand_message_t result; + memset(&result, 0, sizeof(wiegand_message_t)); - if (data->Length >= 64){ - data->Top |= 1 << (data->Length - 64); // leading 1: start bit - data->Top |= 0x09e00000; // Extended-length header - } else if (data->Length > 37){ - data->Mid |= 1 << (data->Length - 32); // leading 1: start bit - data->Top |= 0x09e00000; // Extended-length header - } else if (data->Length == 37){ - // No header bits added to 37-bit cards - } else if (data->Length >= 32){ - data->Mid |= 0x20; // Bit 37; standard header - data->Mid |= 1 << (data->Length - 32); // leading 1: start bit - } else { - data->Mid |= 0x20; // Bit 37; standard header - data->Bot |= 1 << data->Length; // leading 1: start bit - } - return true; + result.Top = top; + result.Mid = mid; + result.Bot = bot; + result.Length = get_length_from_header(&result); + return result; +} + +bool add_HID_header(wiegand_message_t *data) { + if (data->Length > 84 || data->Length == 0) return false; // Invalid value + + if (data->Length >= 64) { + data->Top |= 1 << (data->Length - 64); // leading 1: start bit + data->Top |= 0x09e00000; // Extended-length header + } else if (data->Length > 37) { + data->Mid |= 1 << (data->Length - 32); // leading 1: start bit + data->Top |= 0x09e00000; // Extended-length header + } else if (data->Length == 37) { + // No header bits added to 37-bit cards + } else if (data->Length >= 32) { + data->Mid |= 0x20; // Bit 37; standard header + data->Mid |= 1 << (data->Length - 32); // leading 1: start bit + } else { + data->Mid |= 0x20; // Bit 37; standard header + data->Bot |= 1 << data->Length; // leading 1: start bit + } + return true; } diff --git a/client/wiegand_formatutils.h b/client/wiegand_formatutils.h index d9e74bcb2..534bea4f3 100644 --- a/client/wiegand_formatutils.h +++ b/client/wiegand_formatutils.h @@ -18,32 +18,32 @@ // Structure for packed wiegand messages // Always align lowest value (last transmitted) bit to ordinal position 0 (lowest valued bit bottom) typedef struct { - uint8_t Length; // Number of encoded bits in wiegand message (excluding headers and preamble) - uint32_t Top; // Bits in x<<64 positions - uint32_t Mid; // Bits in x<<32 positions - uint32_t Bot; // Lowest ordinal positions + uint8_t Length; // Number of encoded bits in wiegand message (excluding headers and preamble) + uint32_t Top; // Bits in x<<64 positions + uint32_t Mid; // Bits in x<<32 positions + uint32_t Bot; // Lowest ordinal positions } wiegand_message_t; // Structure for unpacked wiegand card, like HID prox typedef struct { - uint32_t FacilityCode; - uint64_t CardNumber; - uint32_t IssueLevel; - uint32_t OEM; - bool ParityValid; // Only valid for responses + uint32_t FacilityCode; + uint64_t CardNumber; + uint32_t IssueLevel; + uint32_t OEM; + bool ParityValid; // Only valid for responses } wiegand_card_t; -bool get_bit_by_position(wiegand_message_t* data, uint8_t pos); -bool set_bit_by_position(wiegand_message_t* data, bool value, uint8_t pos); +bool get_bit_by_position(wiegand_message_t *data, uint8_t pos); +bool set_bit_by_position(wiegand_message_t *data, bool value, uint8_t pos); -uint64_t get_linear_field(wiegand_message_t* data, uint8_t firstBit, uint8_t length); -bool set_linear_field(wiegand_message_t* data, uint64_t value, uint8_t firstBit, uint8_t length); +uint64_t get_linear_field(wiegand_message_t *data, uint8_t firstBit, uint8_t length); +bool set_linear_field(wiegand_message_t *data, uint64_t value, uint8_t firstBit, uint8_t length); -uint64_t get_nonlinear_field(wiegand_message_t* data, uint8_t numBits, uint8_t* bits); -bool set_nonlinear_field(wiegand_message_t* data, uint64_t value, uint8_t numBits, uint8_t* bits); +uint64_t get_nonlinear_field(wiegand_message_t *data, uint8_t numBits, uint8_t *bits); +bool set_nonlinear_field(wiegand_message_t *data, uint64_t value, uint8_t numBits, uint8_t *bits); wiegand_message_t initialize_message_object(uint32_t top, uint32_t mid, uint32_t bot); -bool add_HID_header(wiegand_message_t* data); +bool add_HID_header(wiegand_message_t *data); #endif