Skip to content

Conversation

@ide
Copy link
Contributor

@ide ide commented Aug 23, 2022

What's new

There appear to be extended HID Proximity keys that are longer than 37 bits that fit into a 44-bit payload (88 raw bits after Manchester encoding, plus the 0x1D preamble for a total of 96 raw bits). These keys don't start with 0b100111 like some extended HID keys supposedly do.

One way to detect these keys is to see if any of the first six bits in the 44-bit payload is a 1. If so, the key is longer than 37 bits. This means the longest key that can fit into a 44-bit payload is 43 bits (the first bit is a 1, followed by 43 key bits).

Also fixed a bug rendering the first nibble of a HID key in protocol_hid_generic_string_cat_protocol_bits.

Verification

Tested by running raw_analyze on known RFID captures:

rfid raw_analyze /ext/hid40.raw
...
   Frequency: 125000.000000
  Duty Cycle: 0.500000
       Warns: 0
   Pulse sum: 25415
Duration sum: 40179
     Average: 0.632544
    Protocol: HIDProx [1X XX XX XX XX X0]
 Description:
40-bit HID Proximity
Data: XXXXXXXXXX
rfid raw_analyze /ext/hid36.raw
...
   Frequency: 125000.000000
  Duty Cycle: 0.500000
       Warns: 0
   Pulse sum: 28080
Duration sum: 41618
     Average: 0.674708
    Protocol: HIDProx [03 XX XX XX XX X0]
 Description:
36-bit HID Proximity
Data: XXXXXXXXX

Checklist (For Reviewer)

  • PR has description of feature/bug or link to Confluence/Jira task
  • Description contains actions to verify feature/bugfix
  • I've built this code, uploaded it to the device and verified feature/bugfix

There appear to be extended HID Proximity keys that are longer than 37 bits that fit into a 44-bit payload (88 raw bits after Manchester encoding, plus the 0x1D preamble for a total of 96 raw bits). These keys don't start with 0b100111 like some extended HID keys supposedly do.

One way to detect these keys is to see if any of the first six bits in the 44-bit payload is a 1. If so, the key is longer than 37 bits. This means the longest key that can fit into a 44-bit payload is 43 bits (the first bit is a 1, followed by 43 key bits).

Also fixed a bug rendering the first nibble of a HID key in `protocol_hid_generic_string_cat_protocol_bits`.

Tested by running `raw_analyze` on known RFID captures:

```
rfid raw_analyze /ext/hid40.raw
...
   Frequency: 125000.000000
  Duty Cycle: 0.500000
       Warns: 0
   Pulse sum: 25415
Duration sum: 40179
     Average: 0.632544
    Protocol: HIDProx [1X XX XX XX XX X0]
 Description:
40-bit HID Proximity
Data: XXXXXXXXXX
```
```
rfid raw_analyze /ext/hid36.raw
...
   Frequency: 125000.000000
  Duty Cycle: 0.500000
       Warns: 0
   Pulse sum: 28080
Duration sum: 41618
     Average: 0.674708
    Protocol: HIDProx [03 XX XX XX XX X0]
 Description:
36-bit HID Proximity
Data: XXXXXXXXX
```
@DrZlo13 DrZlo13 merged commit 32775ea into flipperdevices:zlo/lf-rfid-overhaul Aug 23, 2022
@DrZlo13
Copy link
Member

DrZlo13 commented Aug 23, 2022

Nice job!

skotopes added a commit that referenced this pull request Aug 23, 2022
* Makefile: unit tests pack
* RFID: pulse joiner and its unit test
* Move pulse protocol helpers to appropriate place
* Drop pulse_joiner tests
* Generic protocol, protocols dictionary, unit test
* Protocol dict unit test
* iButton: protocols dictionary
* Lib: varint
* Lib: profiler
* Unit test: varint
* rfid: worker mockup
* LFRFID: em4100 unit test
* Storage: file_exist function
* rfid: fsk osc
* rfid: generic fsk demodulator
* rfid: protocol em4100
* rfid: protocol h10301
* rfid: protocol io prox xsf
* Unit test: rfid protocols
* rfid: new hal
* rfid: raw worker
* Unit test: fix error output
* rfid: worker
* rfid: plain c cli
* fw: migrate to scons
* lfrfid: full io prox support
* unit test: io prox protocol
* SubGHZ: move bit defines to source
* FSK oscillator: level duration compability
* libs: bit manipulation library
* lfrfid: ioprox protocol, use bit library and new level duration method of FSK ocillator
* bit lib: unit tests
* Bit lib: parity tests, remove every nth bit, copy bits
* Lfrfid: awid protocol
* bit lib: uint16 and uint32 getters, unit tests
* lfrfid: FDX-B read, draft version
* Minunit: better memeq assert
* bit lib: reverse, print, print regions
* Protocol dict: get protocol features, get protocol validate count
* lfrfid worker: improved read
* lfrfid raw worker: psk support
* Cli: rfid plain C cli
* protocol AWID: render
* protocol em4100: render
* protocol h10301: render
* protocol indala26: support every indala 26 scramble
* Protocol IO Prox: render
* Protocol FDX-B: advanced read
* lfrfid: remove unused test function
* lfrfid: fix os primitives
* bit lib: crc16 and unit tests
* FDX-B: save data
* lfrfid worker: increase stream size. Alloc raw worker only when needed.
* lfrfid: indala26 emulation
* lfrfid: prepare to write
* lfrfid: fdx-b emulation
* lfrfid: awid, ioprox write
* lfrfid: write t55xx w\o validation
* lfrfid: better t55xx block0 handling
* lfrfid: use new t5577 functions in worker
* lfrfid: improve protocol description
* lfrfid: write and verify
* lfrfid: delete cpp cli
* lfrfid: improve worker usage
* lfrfid-app: step to new worker
* lfrfid: old indala (I40134) load fallback
* lfrfid: indala26, recover wrong synced data
* lfrfid: remove old worker
* lfrfid app: dummy read screen
* lfrfid app: less dummy read screen
* lfrfid: generic 96-bit HID protocol (covers up to HID 37-bit)
* rename
* lfrfid: improve indala26 read
* lfrfid: generic 192-bit HID protocol (covers all HID extended)
* lfrfid: TODO about HID render
* lfrfid: new protocol FDX-A
* lfrfid-app: correct worker stop on exit
* misc fixes
* lfrfid: FDX-A and HID distinguishability has been fixed.
* lfrfid: decode HID size header and render it (#1612)
* lfrfid: rename HID96 and HID192 to HIDProx and HIDExt
* lfrfid: extra actions scene
* lfrfid: decode generic HID Proximity size lazily (#1618)
* lib: stream of data buffers concept
* lfrfid: raw file helper
* lfrfid: changed raw worker api
* lfrfid: packed varint pair
* lfrfid: read stream speedup
* lfrfid app: show read mode
* Documentation
* lfrfid app: raw read gui
* lfrfid app: storage check for raw read
* memleak fix
* review fixes
* lfrfid app: read blink color
* lfrfid app: reset key name after read
* review fixes
* lfrfid app: fix copypasted text
* review fixes
* lfrfid: disable debug gpio
* lfrfid: card detection events
* lfrfid: change validation color from magenta to green
* Update core_defines.
* lfrfid: prefix fdx-b id by zeroes
* lfrfid: parse up to 43-bit HID Proximity keys (#1640)
* Fbt: downgrade toolchain and fix PS1
* lfrfid: fix unit tests
* lfrfid app: remove printf
* lfrfid: indala26, use bit 55 as data
* lfrfid: indala26, better brief format
* lfrfid: indala26, loading fallback
* lfrfid: read timing tuning

Co-authored-by: James Ide <[email protected]>
Co-authored-by: あく <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants