@@ -356,8 +356,8 @@ ReturnCode picopass_device_parse_credential(PicopassBlock* AA1, PicopassPacs* pa
356
356
return ERR_NONE ;
357
357
}
358
358
359
- ReturnCode picopass_device_parse_wiegand (uint8_t * data , PicopassWiegandRecord * record ) {
360
- uint32_t * halves = (uint32_t * )data ;
359
+ ReturnCode picopass_device_parse_wiegand (uint8_t * credential , PicopassWiegandRecord * record ) {
360
+ uint32_t * halves = (uint32_t * )credential ;
361
361
if (halves [0 ] == 0 ) {
362
362
uint8_t leading0s = __builtin_clz (REVERSE_BYTES_U32 (halves [1 ]));
363
363
record -> bitLength = 31 - leading0s ;
@@ -367,8 +367,16 @@ ReturnCode picopass_device_parse_wiegand(uint8_t* data, PicopassWiegandRecord* r
367
367
}
368
368
FURI_LOG_D (TAG , "bitLength: %d" , record -> bitLength );
369
369
370
+ // Remove sentinel bit from credential. Byteswapping to handle array of bytes vs 64bit value
371
+ uint64_t sentinel = __builtin_bswap64 (1ULL << record -> bitLength );
372
+ uint64_t swapped = 0 ;
373
+ memcpy (& swapped , credential , sizeof (uint64_t ));
374
+ swapped = swapped ^ sentinel ;
375
+ memcpy (credential , & swapped , sizeof (uint64_t ));
376
+ FURI_LOG_D (TAG , "PACS: (%d) %016llx" , record -> bitLength , swapped );
377
+
370
378
if (record -> bitLength == 26 ) {
371
- uint8_t * v4 = data + 4 ;
379
+ uint8_t * v4 = credential + 4 ;
372
380
uint32_t bot = v4 [3 ] | (v4 [2 ] << 8 ) | (v4 [1 ] << 16 ) | (v4 [0 ] << 24 );
373
381
374
382
record -> CardNumber = (bot >> 1 ) & 0xFFFF ;
0 commit comments