Fix Wiegand P10004: remove wrong parity scheme and fix FC/CN boundary checks

This commit is contained in:
Philippe Teuwen 2022-01-18 12:03:44 +01:00
commit 6f1262aa3f

View file

@ -773,8 +773,8 @@ static bool Unpack_H10302(wiegand_message_t *packed, wiegand_card_t *card) {
static bool Pack_P10004(wiegand_card_t *card, wiegand_message_t *packed, bool preamble) {
memset(packed, 0, sizeof(wiegand_message_t));
if (card->FacilityCode > 0x0000FFFF) return false; // Can't encode FC.
if (card->CardNumber > 0x0007FFFF) return false; // Can't encode CN.
if (card->FacilityCode > 0x00001FFF) return false; // Can't encode FC.
if (card->CardNumber > 0x0003FFFF) 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
@ -782,9 +782,7 @@ static bool Pack_P10004(wiegand_card_t *card, wiegand_message_t *packed, bool pr
set_linear_field(packed, card->FacilityCode, 1, 13);
set_linear_field(packed, card->CardNumber, 14, 18);
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);
// unknown parity scheme
if (preamble)
return add_HID_header(packed);
return true;
@ -797,9 +795,7 @@ static bool Unpack_P10004(wiegand_message_t *packed, wiegand_card_t *card) {
card->FacilityCode = get_linear_field(packed, 1, 13);
card->CardNumber = get_linear_field(packed, 14, 18);
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)));
// unknown parity scheme
return true;
}
@ -1403,7 +1399,7 @@ static const cardformat_t FormatTable[] = {
{"H10320", Pack_H10320, Unpack_H10320, "HID H10320 36-bit BCD", {1, 0, 0, 0, 1}}, // from Proxmark forums
{"H10302", Pack_H10302, Unpack_H10302, "HID H10302 37-bit huge ID", {1, 0, 0, 0, 1}}, // from Proxmark forums
{"H10304", Pack_H10304, Unpack_H10304, "HID H10304 37-bit", {1, 1, 0, 0, 1}}, // from cardinfo.barkweb.com.au
{"P10004", Pack_P10004, Unpack_P10004, "HID P10004 37-bit PCSC", {1, 1, 0, 0, 1}}, // from BT
{"P10004", Pack_P10004, Unpack_P10004, "HID P10004 37-bit PCSC", {1, 1, 0, 0, 0}}, // from BT
{"HGen37", Pack_HGeneric37, Unpack_HGeneric37, "HID Generic 37-bit", {1, 0, 0, 0, 1}}, // from cardinfo.barkweb.com.au
{"MDI37", Pack_MDI37, Unpack_MDI37, "PointGuard MDI 37-bit", {1, 1, 0, 0, 1}}, // from cardinfo.barkweb.com.au
{"BQT38", Pack_bqt38, Unpack_bqt38, "BQT 38-bit", {1, 1, 1, 0, 1}}, // from cardinfo.barkweb.com.au