Skip to content

Add 06cb:00cb (HP Pavilion x360 14-dh, sensor type 0x969)#3

Open
ggiesen wants to merge 1 commit into
SimpleX-T:feat/sensor-type-0xd51from
ggiesen:add-06cb-00cb
Open

Add 06cb:00cb (HP Pavilion x360 14-dh, sensor type 0x969)#3
ggiesen wants to merge 1 commit into
SimpleX-T:feat/sensor-type-0xd51from
ggiesen:add-06cb-00cb

Conversation

@ggiesen

@ggiesen ggiesen commented Jul 9, 2026

Copy link
Copy Markdown

06cb:00cb is the HP Pavilion x360 14-dh1008ca fingerprint reader -- a Validity VCSFW sensor type 0x969 (identifies "57K0 FM-3439"), the same silicon as the ZBook 138a:00ab this branch already supports. So it reuses the existing 0x969 -> 0x199 profile handling and only needs its device registration, its own reset_blob, and its firmware.

What's here

  • usb.py: DEV_CB = (0x06cb, 0x00cb).
  • blobs_00cb.py: init_hardcoded, init_hardcoded_clean_slate, and db_write_enable are byte-identical to blobs_9a (imported from it); only reset_blob differs.
  • firmware_tables.py: 6_07f_hp_mis_qm.xpfwext, auto-fetched from HP SoftPaq sp138431 (URL + sha512 verified; validity-sensors-firmware extracts it via innoextract/cabextract like the other HP entries).

No sensor.py change -- the 0x969 alias and the FM-3439 suspend/resume handling on this branch already cover it (the capture() b[0]==3 fix already keys off real_device_type in (0xd51, 0x969)).

Why a device-specific reset_blob

This unit shipped paired to a previous host, and factory_reset() couldn't wipe it: the reset_blob from every existing set (blobs_90/97/9a/9d) is rejected 0404/04be on 0x00cb. So it needs its own. I recovered it by static RE of HP's Windows SGX driver (synaWudfBioUsb116SGX.dll) -- the signed blobs are stored there in a 30-entry descriptor table, without their leading 06 command byte. A passive USB capture is a dead end here (the driver's reset rides an ephemeral-ECDH bootstrap TLS session, so the key isn't recoverable from a pcap). Two ~12 KB table entries were size-plausible; I trialled both on hardware -- the 11972-byte one is accepted (0x0000, wipes the flash 5 partitions -> 0), the other rejected (0x04aa).

Validation

Confirmed on the actual 06cb:00cb hardware running this branch's exact code (real_type=0x969 at open): the sensor initializes, calibrates via the 0x969 -> 0x199 profile, and enroll, verify, and delete all work -- verify matches the enrolled finger and rejects others; it also survives a reboot (firmware restored into /run before the daemon opens). init_hardcoded / init_hardcoded_clean_slate / db_write_enable == blobs_9a is confirmed (the on-wire init_hardcoded matches and init_db succeeds). The reset_blob was confirmed on the foreign-paired unit (accepted 0x0000, wipes the flash); factory_reset sends it as a raw pre-TLS usb.cmd, so it's independent of the profile routing.

RE detail and the full story: uunicorn#263.

Same 0x969 silicon as the ZBook 138a:00ab already supported on this
branch, so it reuses the existing 0x199-profile handling and needs only
its own device registration, reset_blob, and firmware.

- usb.py: register DEV_CB = (0x06cb, 0x00cb).
- blobs_00cb.py: init_hardcoded / init_hardcoded_clean_slate /
  db_write_enable are byte-identical to blobs_9a; only reset_blob is
  06cb:00cb-specific (every existing set's reset_blob is rejected
  0404/04be on this chip, so factory_reset couldn't wipe a foreign
  pairing). Recovered by static RE of HP's Windows SGX driver
  (synaWudfBioUsb116SGX.dll) and confirmed on hardware.
- firmware_tables.py: fetch 6_07f_hp_mis_qm.xpfwext from HP SoftPaq
  sp138431 (validity-sensors-firmware auto-provisions it).

Confirmed on hardware: factory_reset wipes the foreign pairing, then
re-partition / pair / calibrate / enroll / verify all work.
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.

1 participant