mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-09-10 13:00:08 +00:00
Compare commits
168
Commits
+80
-42
@@ -4,9 +4,10 @@ include:
|
|||||||
- project: 'freedesktop/ci-templates'
|
- project: 'freedesktop/ci-templates'
|
||||||
ref: master
|
ref: master
|
||||||
file: '/templates/fedora.yml'
|
file: '/templates/fedora.yml'
|
||||||
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml'
|
- remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/71e636e012ae0ab04c5e0fe40ca73ada91ae6bde/flatpak/flatpak_ci_initiative.yml'
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
interruptible: true
|
||||||
# Auto-retry jobs in case of infra failures
|
# Auto-retry jobs in case of infra failures
|
||||||
retry:
|
retry:
|
||||||
max: 1
|
max: 1
|
||||||
@@ -28,6 +29,8 @@ workflow:
|
|||||||
rules:
|
rules:
|
||||||
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
|
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
|
||||||
- if: $CI_PIPELINE_SOURCE == 'push'
|
- if: $CI_PIPELINE_SOURCE == 'push'
|
||||||
|
- if: $CI_PIPELINE_SOURCE == 'schedule'
|
||||||
|
- if: $CI_PROJECT_NAMESPACE == 'libfprint' && $LIBFPRINT_CI_ACTION != ''
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- image-build
|
- image-build
|
||||||
@@ -35,12 +38,13 @@ stages:
|
|||||||
- build
|
- build
|
||||||
- test
|
- test
|
||||||
- flatpak
|
- flatpak
|
||||||
|
- deploy
|
||||||
|
|
||||||
image: $FEDORA_IMAGE
|
image: $FEDORA_IMAGE
|
||||||
|
|
||||||
.build_one_driver_template: &build_one_driver
|
.build_one_driver_template: &build_one_driver
|
||||||
script:
|
script:
|
||||||
# Build with a driver that doesn't need imaging, or nss
|
# Build with a driver that doesn't need imaging, or openssl
|
||||||
- meson setup _build --werror -Ddrivers=$driver
|
- meson setup _build --werror -Ddrivers=$driver
|
||||||
- meson compile -C _build
|
- meson compile -C _build
|
||||||
- rm -rf _build/
|
- rm -rf _build/
|
||||||
@@ -56,11 +60,16 @@ image: $FEDORA_IMAGE
|
|||||||
script:
|
script:
|
||||||
- ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)
|
- ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)
|
||||||
|
|
||||||
|
.standard_job:
|
||||||
|
rules:
|
||||||
|
- when: on_success
|
||||||
|
- if: $CI_PIPELINE_SOURCE == "schedule"
|
||||||
|
when: never
|
||||||
|
|
||||||
build:
|
build:
|
||||||
stage: build
|
stage: build
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
variables:
|
variables:
|
||||||
driver: virtual_image
|
driver: virtual_image
|
||||||
<<: *build_one_driver
|
<<: *build_one_driver
|
||||||
@@ -75,13 +84,12 @@ build:
|
|||||||
|
|
||||||
test:
|
test:
|
||||||
stage: test
|
stage: test
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
script:
|
script:
|
||||||
- meson setup _build --werror -Ddrivers=all -Db_coverage=true
|
- meson setup _build --werror -Ddrivers=all -Db_coverage=true
|
||||||
- meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3
|
- meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3
|
||||||
- ninja -C _build coverage
|
- ninja -C _build coverage || true
|
||||||
- cat _build/meson-logs/coverage.txt || true
|
- cat _build/meson-logs/coverage.txt || true
|
||||||
artifacts:
|
artifacts:
|
||||||
reports:
|
reports:
|
||||||
@@ -99,10 +107,8 @@ test:
|
|||||||
|
|
||||||
test_valgrind:
|
test_valgrind:
|
||||||
stage: test
|
stage: test
|
||||||
allow_failure: true
|
extends:
|
||||||
except:
|
- .standard_job
|
||||||
variables:
|
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
script:
|
script:
|
||||||
- meson setup _build -Ddrivers=all
|
- meson setup _build -Ddrivers=all
|
||||||
- meson compile -C _build
|
- meson compile -C _build
|
||||||
@@ -117,11 +123,27 @@ test_valgrind:
|
|||||||
- _build/meson-logs/testlog-valgrind.txt
|
- _build/meson-logs/testlog-valgrind.txt
|
||||||
expire_in: 1 week
|
expire_in: 1 week
|
||||||
|
|
||||||
|
test_asan:
|
||||||
|
stage: test
|
||||||
|
extends:
|
||||||
|
- .standard_job
|
||||||
|
script:
|
||||||
|
- meson setup _build -Ddrivers=all -Db_sanitize=address,undefined
|
||||||
|
- meson test -C _build --print-errorlogs --no-stdsplit
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: "_build/meson-logs/testlog.junit.xml"
|
||||||
|
expose_as: 'Sanitizers test logs'
|
||||||
|
when: always
|
||||||
|
paths:
|
||||||
|
- _build/meson-logs
|
||||||
|
- _build/meson-logs/testlog.txt
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
test_installed:
|
test_installed:
|
||||||
stage: test
|
stage: test
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
script:
|
script:
|
||||||
- meson setup _build --prefix=/usr -Ddrivers=all
|
- meson setup _build --prefix=/usr -Ddrivers=all
|
||||||
- meson install -C _build
|
- meson install -C _build
|
||||||
@@ -143,9 +165,8 @@ test_installed:
|
|||||||
|
|
||||||
test_scan_build:
|
test_scan_build:
|
||||||
stage: test
|
stage: test
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- meson setup _build -Ddrivers=all
|
- meson setup _build -Ddrivers=all
|
||||||
@@ -160,19 +181,23 @@ test_scan_build:
|
|||||||
|
|
||||||
test_indent:
|
test_indent:
|
||||||
stage: check-source
|
stage: check-source
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
script:
|
script:
|
||||||
- scripts/uncrustify.sh
|
- scripts/uncrustify.sh
|
||||||
- git diff
|
- git diff
|
||||||
- git diff-index --name-only --exit-code HEAD
|
- git diff-index --name-only --exit-code HEAD
|
||||||
|
rules:
|
||||||
|
- changes:
|
||||||
|
compare_to: 'refs/heads/master'
|
||||||
|
paths:
|
||||||
|
- '**/*.c'
|
||||||
|
- '**/*.h'
|
||||||
|
|
||||||
test_unsupported_list:
|
test_unsupported_list:
|
||||||
stage: check-source
|
stage: check-source
|
||||||
except:
|
extends:
|
||||||
variables:
|
- .standard_job
|
||||||
- $CI_PIPELINE_SOURCE == "schedule"
|
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
script:
|
script:
|
||||||
- tests/hwdb-check-unsupported.py
|
- tests/hwdb-check-unsupported.py
|
||||||
@@ -192,7 +217,7 @@ flatpak:
|
|||||||
- if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
|
- if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
|
||||||
when: manual
|
when: manual
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
- if: $CI_PIPELINE_SOURCE == "schedule"
|
||||||
when: never
|
when: never
|
||||||
- if: '$CI_COMMIT_BRANCH == "master"'
|
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
@@ -213,9 +238,6 @@ flatpak:
|
|||||||
.container_fedora_build_base:
|
.container_fedora_build_base:
|
||||||
extends: .fdo.container-build@fedora
|
extends: .fdo.container-build@fedora
|
||||||
stage: image-build
|
stage: image-build
|
||||||
only:
|
|
||||||
variables:
|
|
||||||
- $CI_PIPELINE_SOURCE == "never"
|
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
|
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
|
||||||
# a list of packages to install
|
# a list of packages to install
|
||||||
@@ -226,6 +248,8 @@ flatpak:
|
|||||||
libudev-devel
|
libudev-devel
|
||||||
FDO_DISTRIBUTION_EXEC: |
|
FDO_DISTRIBUTION_EXEC: |
|
||||||
$LIBFPRINT_EXEC
|
$LIBFPRINT_EXEC
|
||||||
|
rules:
|
||||||
|
- when: never
|
||||||
|
|
||||||
.container_fedora_build_forced:
|
.container_fedora_build_forced:
|
||||||
variables:
|
variables:
|
||||||
@@ -235,25 +259,39 @@ container_fedora_build_schedule:
|
|||||||
extends:
|
extends:
|
||||||
- .container_fedora_build_base
|
- .container_fedora_build_base
|
||||||
- .container_fedora_build_forced
|
- .container_fedora_build_forced
|
||||||
only:
|
rules:
|
||||||
variables:
|
- if: $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
|
||||||
- $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
|
when: always
|
||||||
|
|
||||||
container_fedora_build_manual:
|
container_fedora_build_manual:
|
||||||
extends:
|
extends:
|
||||||
- .container_fedora_build_base
|
- .container_fedora_build_base
|
||||||
- .container_fedora_build_forced
|
- .container_fedora_build_forced
|
||||||
only:
|
rules:
|
||||||
variables:
|
- if: $LIBFPRINT_CI_ACTION == "build-image"
|
||||||
- $LIBFPRINT_CI_ACTION == "build-image"
|
when: always
|
||||||
|
|
||||||
container_fedora_build_on_deps_changed:
|
container_fedora_build_on_deps_changed:
|
||||||
extends: .container_fedora_build_base
|
extends: .container_fedora_build_base
|
||||||
only:
|
rules:
|
||||||
variables:
|
- if: $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
|
||||||
- $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
|
|
||||||
refs:
|
|
||||||
- branches
|
|
||||||
- merge_requests
|
|
||||||
changes:
|
changes:
|
||||||
- .gitlab-ci/libfprint-image-variables.yaml
|
compare_to: 'refs/heads/master'
|
||||||
|
paths:
|
||||||
|
- '.gitlab-ci/libfprint-image-variables.yaml'
|
||||||
|
- '.gitlab-ci/libfprint-templates.yaml'
|
||||||
|
|
||||||
|
pages:
|
||||||
|
image: alpine:latest
|
||||||
|
stage: deploy
|
||||||
|
needs:
|
||||||
|
- job: test
|
||||||
|
artifacts: true
|
||||||
|
script:
|
||||||
|
- mkdir public
|
||||||
|
- mv _build/meson-logs/coveragereport public/coverage
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
rules:
|
||||||
|
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE == "push"
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
variables:
|
variables:
|
||||||
LIBFPRINT_IMAGE_TAG: v3
|
LIBFPRINT_IMAGE_TAG: v6
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
.libfprint_common_variables:
|
.libfprint_common_variables:
|
||||||
LIBFPRINT_DEPENDENCIES:
|
LIBFPRINT_DEPENDENCIES:
|
||||||
|
appstream
|
||||||
doxygen
|
doxygen
|
||||||
dnf-plugins-core
|
dnf-plugins-core
|
||||||
flatpak-builder
|
flatpak-builder
|
||||||
@@ -17,12 +18,14 @@
|
|||||||
gtk-doc
|
gtk-doc
|
||||||
gtk3-devel
|
gtk3-devel
|
||||||
libabigail
|
libabigail
|
||||||
|
libasan
|
||||||
libgusb-devel
|
libgusb-devel
|
||||||
libgudev-devel
|
libgudev-devel
|
||||||
|
libubsan
|
||||||
libX11-devel
|
libX11-devel
|
||||||
libXv-devel
|
libXv-devel
|
||||||
meson
|
meson
|
||||||
nss-devel
|
openssl-devel
|
||||||
pixman-devel
|
pixman-devel
|
||||||
python3-cairo
|
python3-cairo
|
||||||
python3-gobject
|
python3-gobject
|
||||||
@@ -40,10 +43,7 @@
|
|||||||
glibc \
|
glibc \
|
||||||
libgusb \
|
libgusb \
|
||||||
libusb \
|
libusb \
|
||||||
nss \
|
openssl \
|
||||||
pixman
|
pixman \
|
||||||
|
python3-gobject \
|
||||||
git clone https://github.com/martinpitt/umockdev.git && \
|
python3-gobject-base
|
||||||
cd umockdev && \
|
|
||||||
meson _build --prefix=/usr && \
|
|
||||||
ninja -C _build && ninja -C _build install
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# This wrapper just disables the malloc checker
|
# This wrapper just disables the malloc checker
|
||||||
exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc "$@"
|
exec /usr/bin/scan-build --status-bugs -disable-checker unix.Malloc --exclude "_build/meson-private" "$@"
|
||||||
|
|||||||
@@ -1,6 +1,51 @@
|
|||||||
This file lists notable changes in each release. For the full history of all
|
This file lists notable changes in each release. For the full history of all
|
||||||
changes, see ChangeLog.
|
changes, see ChangeLog.
|
||||||
|
|
||||||
|
2026-02-10: v1.94.10 release
|
||||||
|
|
||||||
|
Highlights:
|
||||||
|
* synaptics: Add USB reset in probe to recover stall condition
|
||||||
|
* synaptics: New PIDs 0x0169, 0x019F, 0x00E9, 0x01A0, 0x0109, 0x010A
|
||||||
|
* goodixmoc: New PID 0x66A9
|
||||||
|
* goodixmoc: Fix crash in exit callback handler
|
||||||
|
* fpcmoc: New PID 0xA306
|
||||||
|
* fpcmoc: Fix interrupt cancellable leak
|
||||||
|
* elanmoc: New PIDs 0x0CA7, 0x0CA8, 0x0CB0
|
||||||
|
* egismoc: New PIDs 0x0584, 0x0588
|
||||||
|
* focaltech_moc: New PIDs 0xA27A, 0x1579
|
||||||
|
* realtek: New PID 0xFA03
|
||||||
|
* fp-device: Clarify getter for open property
|
||||||
|
* libfprint: Use fatal-warnings on g-i-scanner
|
||||||
|
|
||||||
|
2025-02-20: v1.94.9 release
|
||||||
|
|
||||||
|
Highlights:
|
||||||
|
* uru4000: Use OpenSSL to perform AES-ECB encryption, as per this libfprint
|
||||||
|
does not support on NSS, but on openssl (>= 3.0).
|
||||||
|
* goodixmoc: New PIDs 0x60C2, 0x689A
|
||||||
|
* synaptics: New PIDs 0x016C, 0x0174, 0x0107, 0x0108, 0x00C2, 0x00F0
|
||||||
|
* fpcmoc: New PID 0xC844
|
||||||
|
* focaltech_moc: New PIDs 0xA99A, 0xA57A, 0xA78A
|
||||||
|
* elanmoc: New PIDs 0x0C98, 0x0C9D, 0x0CA3
|
||||||
|
* elanspi: New PIDs 0x3128, 0x2766
|
||||||
|
* fp-device: Add FP_DEVICE_RETRY_TOO_FAST retry error
|
||||||
|
* data: AppStream meta info listing supported USB devices.
|
||||||
|
* fixed various memory issues in multiple devices
|
||||||
|
|
||||||
|
2024-09-03: v1.94.8 release
|
||||||
|
|
||||||
|
Highlights:
|
||||||
|
* build: Support building in non-linux unix environments (tested in FreeBSD)
|
||||||
|
* egismoc: New PIDs 0x0583, 0x0586, 0x0587.
|
||||||
|
* elanmoc: New PID 0x0C9F.
|
||||||
|
* fpcmoc: New PIDs 0x9524, 0x9544.
|
||||||
|
* goodixmoc: New PIDs 0x609A, 0x650A, 0x650C, 0x6512.
|
||||||
|
* realtek: New PID 0x5816.
|
||||||
|
* synaptics: New PIDs 0x00C4, 0x019D, 0x00C6.
|
||||||
|
* fpcmoc: fix incorrect immobile handling during enrollment.
|
||||||
|
* fpcmoc: fixed jumping to wrong state at end of custom enroll.
|
||||||
|
* egismoc: various code cleanups.
|
||||||
|
|
||||||
2024-02-20: v1.94.7 release
|
2024-02-20: v1.94.7 release
|
||||||
|
|
||||||
Highlights:
|
Highlights:
|
||||||
|
|||||||
-25
@@ -1,25 +0,0 @@
|
|||||||
### libfprint-TOD v1
|
|
||||||
|
|
||||||
- First public release
|
|
||||||
- Based on [libfprint 1.90.1](https://gitlab.freedesktop.org/libfprint/libfprint/-/releases#v1.90.1)
|
|
||||||
- Bumped TOD version to 1
|
|
||||||
|
|
||||||
### Highlights of the Drivers API changes
|
|
||||||
|
|
||||||
Both the driver and external APIs have changed, as both the verify and the identify functions now have early reporting mechanisms.
|
|
||||||
|
|
||||||
- Added API for early report of matching results or retry errors
|
|
||||||
- Verify and identification completion functions have been simplified
|
|
||||||
- Support variadic arguments in error functions
|
|
||||||
- Various re-definitions of ownership handling
|
|
||||||
- Add convenience API to change state after a timeout
|
|
||||||
- Add unit tests for all the drivers API
|
|
||||||
|
|
||||||
### Drivers required changes
|
|
||||||
As per the early report mechanism, drivers need to adapt, in particular:
|
|
||||||
- New pkg-config dependency name is `libfprint-2-tod-1`
|
|
||||||
- Verification and Identification API for non-image drivers has changed and drivers need to both `report` the result of the action and complete it:
|
|
||||||
- `fpi_device_{verify,identify}_report` must inform whether a match/no-match or identification happened or report a *retry error*.
|
|
||||||
- `fpi_device_{verify,identify}_complete` must be called once the device has completed the verification / identification process, in case reporting device errors (not retry ones!)
|
|
||||||
|
|
||||||
You can see examples of changes needed in the [reference example driver](https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver/-/commit/8308f84f7d1cfd1b9ed0936c13c73b43a4a46772) or the [upstream synaptics driver](https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/112/diffs)
|
|
||||||
@@ -19,10 +19,6 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## TOD Informations
|
|
||||||
|
|
||||||
See https://gitlab.freedesktop.org/3v1n0/libfprint/-/blob/tod/README.tod.md
|
|
||||||
|
|
||||||
## History
|
## History
|
||||||
|
|
||||||
**LibFPrint** was originally developed as part of an
|
**LibFPrint** was originally developed as part of an
|
||||||
@@ -50,6 +46,12 @@ We include **Bozorth3** from the **[US Export Controlled]**
|
|||||||
distribution, which we have determined to be fine
|
distribution, which we have determined to be fine
|
||||||
being shipped in an open source project.
|
being shipped in an open source project.
|
||||||
|
|
||||||
|
## Get in *touch*
|
||||||
|
|
||||||
|
- [IRC] - `#fprint` @ `irc.oftc.net`
|
||||||
|
- [Matrix] - `#fprint:matrix.org` bridged to the IRC channel
|
||||||
|
- [MailingList] - low traffic, not much used these days
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div align="right">
|
<div align="right">
|
||||||
@@ -66,6 +68,9 @@ being shipped in an open source project.
|
|||||||
[Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices
|
[Unsupported]: https://gitlab.freedesktop.org/libfprint/wiki/-/wikis/Unsupported-Devices
|
||||||
[Supported]: https://fprint.freedesktop.org/supported-devices.html
|
[Supported]: https://fprint.freedesktop.org/supported-devices.html
|
||||||
[Website]: https://fprint.freedesktop.org/
|
[Website]: https://fprint.freedesktop.org/
|
||||||
|
[MailingList]: https://lists.freedesktop.org/mailman/listinfo/fprint
|
||||||
|
[IRC]: ircs://irc.oftc.net:6697/#fprint
|
||||||
|
[Matrix]: https://matrix.to/#/#fprint:matrix.org
|
||||||
|
|
||||||
[Contribute]: ./HACKING.md
|
[Contribute]: ./HACKING.md
|
||||||
[License]: ./COPYING
|
[License]: ./COPYING
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
### libfprint-TOD - libfprint for Touch OEM Drivers
|
|
||||||
|
|
||||||
This is a light fork of libfprint to expose internal Drivers API in order to
|
|
||||||
create drivers as shared libraries.
|
|
||||||
|
|
||||||
Fork is hosted at: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
|
|
||||||
|
|
||||||
An example driver implementation is available:
|
|
||||||
- https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver
|
|
||||||
+87
-7
@@ -79,7 +79,13 @@ usb:v1C7Ap0571*
|
|||||||
|
|
||||||
# Supported by libfprint driver egismoc
|
# Supported by libfprint driver egismoc
|
||||||
usb:v1C7Ap0582*
|
usb:v1C7Ap0582*
|
||||||
|
usb:v1C7Ap0583*
|
||||||
|
usb:v1C7Ap0584*
|
||||||
|
usb:v1C7Ap0586*
|
||||||
|
usb:v1C7Ap0587*
|
||||||
|
usb:v1C7Ap0588*
|
||||||
usb:v1C7Ap05A1*
|
usb:v1C7Ap05A1*
|
||||||
|
usb:v1C7Ap05A5*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -155,7 +161,14 @@ usb:v04F3p0C82*
|
|||||||
usb:v04F3p0C88*
|
usb:v04F3p0C88*
|
||||||
usb:v04F3p0C8C*
|
usb:v04F3p0C8C*
|
||||||
usb:v04F3p0C8D*
|
usb:v04F3p0C8D*
|
||||||
|
usb:v04F3p0C98*
|
||||||
usb:v04F3p0C99*
|
usb:v04F3p0C99*
|
||||||
|
usb:v04F3p0C9D*
|
||||||
|
usb:v04F3p0C9F*
|
||||||
|
usb:v04F3p0CA3*
|
||||||
|
usb:v04F3p0CA7*
|
||||||
|
usb:v04F3p0CA8*
|
||||||
|
usb:v04F3p0CB0*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -167,16 +180,27 @@ usb:v1C7Ap0603*
|
|||||||
# Supported by libfprint driver focaltech_moc
|
# Supported by libfprint driver focaltech_moc
|
||||||
usb:v2808p9E48*
|
usb:v2808p9E48*
|
||||||
usb:v2808pD979*
|
usb:v2808pD979*
|
||||||
|
usb:v2808pA27A*
|
||||||
usb:v2808pA959*
|
usb:v2808pA959*
|
||||||
|
usb:v2808pA99A*
|
||||||
|
usb:v2808pA57A*
|
||||||
|
usb:v2808pA78A*
|
||||||
|
usb:v2808p1579*
|
||||||
|
usb:v2808p077A*
|
||||||
|
usb:v2808p079A*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
# Supported by libfprint driver fpcmoc
|
# Supported by libfprint driver fpcmoc
|
||||||
usb:v10A5pFFE0*
|
usb:v10A5pFFE0*
|
||||||
usb:v10A5pA305*
|
usb:v10A5pA305*
|
||||||
|
usb:v10A5pA306*
|
||||||
usb:v10A5pDA04*
|
usb:v10A5pDA04*
|
||||||
usb:v10A5pD805*
|
usb:v10A5pD805*
|
||||||
usb:v10A5pD205*
|
usb:v10A5pD205*
|
||||||
|
usb:v10A5p9524*
|
||||||
|
usb:v10A5p9544*
|
||||||
|
usb:v10A5pC844*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -185,10 +209,12 @@ usb:v27C6p5840*
|
|||||||
usb:v27C6p6014*
|
usb:v27C6p6014*
|
||||||
usb:v27C6p6092*
|
usb:v27C6p6092*
|
||||||
usb:v27C6p6094*
|
usb:v27C6p6094*
|
||||||
|
usb:v27C6p609A*
|
||||||
usb:v27C6p609C*
|
usb:v27C6p609C*
|
||||||
usb:v27C6p60A2*
|
usb:v27C6p60A2*
|
||||||
usb:v27C6p60A4*
|
usb:v27C6p60A4*
|
||||||
usb:v27C6p60BC*
|
usb:v27C6p60BC*
|
||||||
|
usb:v27C6p60C2*
|
||||||
usb:v27C6p6304*
|
usb:v27C6p6304*
|
||||||
usb:v27C6p631C*
|
usb:v27C6p631C*
|
||||||
usb:v27C6p633C*
|
usb:v27C6p633C*
|
||||||
@@ -199,6 +225,8 @@ usb:v27C6p63AC*
|
|||||||
usb:v27C6p63BC*
|
usb:v27C6p63BC*
|
||||||
usb:v27C6p63CC*
|
usb:v27C6p63CC*
|
||||||
usb:v27C6p6496*
|
usb:v27C6p6496*
|
||||||
|
usb:v27C6p650A*
|
||||||
|
usb:v27C6p650C*
|
||||||
usb:v27C6p6582*
|
usb:v27C6p6582*
|
||||||
usb:v27C6p6584*
|
usb:v27C6p6584*
|
||||||
usb:v27C6p658C*
|
usb:v27C6p658C*
|
||||||
@@ -207,6 +235,9 @@ usb:v27C6p6594*
|
|||||||
usb:v27C6p659A*
|
usb:v27C6p659A*
|
||||||
usb:v27C6p659C*
|
usb:v27C6p659C*
|
||||||
usb:v27C6p6A94*
|
usb:v27C6p6A94*
|
||||||
|
usb:v27C6p6512*
|
||||||
|
usb:v27C6p689A*
|
||||||
|
usb:v27C6p66A9*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -217,27 +248,42 @@ usb:v298Dp1010*
|
|||||||
|
|
||||||
# Supported by libfprint driver realtek
|
# Supported by libfprint driver realtek
|
||||||
usb:v0BDAp5813*
|
usb:v0BDAp5813*
|
||||||
|
usb:v0BDAp5816*
|
||||||
|
usb:v2541pFA03*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
# Supported by libfprint driver synaptics
|
# Supported by libfprint driver synaptics
|
||||||
usb:v06CBp00BD*
|
usb:v06CBp00BD*
|
||||||
|
usb:v06CBp00C2*
|
||||||
|
usb:v06CBp00C4*
|
||||||
|
usb:v06CBp00C6*
|
||||||
usb:v06CBp00DF*
|
usb:v06CBp00DF*
|
||||||
|
usb:v06CBp00E9*
|
||||||
|
usb:v06CBp00F0*
|
||||||
usb:v06CBp00F9*
|
usb:v06CBp00F9*
|
||||||
usb:v06CBp00FC*
|
usb:v06CBp00FC*
|
||||||
usb:v06CBp00C2*
|
|
||||||
usb:v06CBp0100*
|
usb:v06CBp0100*
|
||||||
usb:v06CBp00F0*
|
|
||||||
usb:v06CBp0103*
|
usb:v06CBp0103*
|
||||||
|
usb:v06CBp0104*
|
||||||
|
usb:v06CBp0106*
|
||||||
|
usb:v06CBp0107*
|
||||||
|
usb:v06CBp0108*
|
||||||
|
usb:v06CBp0109*
|
||||||
|
usb:v06CBp010A*
|
||||||
usb:v06CBp0123*
|
usb:v06CBp0123*
|
||||||
usb:v06CBp0124*
|
usb:v06CBp0124*
|
||||||
usb:v06CBp0126*
|
usb:v06CBp0126*
|
||||||
usb:v06CBp0129*
|
usb:v06CBp0129*
|
||||||
usb:v06CBp0168*
|
|
||||||
usb:v06CBp015F*
|
usb:v06CBp015F*
|
||||||
usb:v06CBp0104*
|
usb:v06CBp0168*
|
||||||
|
usb:v06CBp0169*
|
||||||
|
usb:v06CBp016C*
|
||||||
usb:v06CBp0173*
|
usb:v06CBp0173*
|
||||||
usb:v06CBp0106*
|
usb:v06CBp0174*
|
||||||
|
usb:v06CBp019D*
|
||||||
|
usb:v06CBp019F*
|
||||||
|
usb:v06CBp01A0*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
@@ -306,7 +352,10 @@ usb:v138Ap0091*
|
|||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|
||||||
# Known unsupported devices
|
# Known unsupported devices
|
||||||
|
usb:v0A5Cp5802*
|
||||||
usb:v047Dp00F2*
|
usb:v047Dp00F2*
|
||||||
|
usb:v047Dp8054*
|
||||||
|
usb:v047Dp8055*
|
||||||
usb:v04E8p730B*
|
usb:v04E8p730B*
|
||||||
usb:v04F3p036B*
|
usb:v04F3p036B*
|
||||||
usb:v04F3p0C00*
|
usb:v04F3p0C00*
|
||||||
@@ -314,27 +363,37 @@ usb:v04F3p0C4C*
|
|||||||
usb:v04F3p0C57*
|
usb:v04F3p0C57*
|
||||||
usb:v04F3p0C5E*
|
usb:v04F3p0C5E*
|
||||||
usb:v04F3p0C5A*
|
usb:v04F3p0C5A*
|
||||||
|
usb:v04F3p0C60*
|
||||||
usb:v04F3p0C6C*
|
usb:v04F3p0C6C*
|
||||||
usb:v04F3p0C70*
|
usb:v04F3p0C70*
|
||||||
usb:v04F3p0C72*
|
usb:v04F3p0C72*
|
||||||
usb:v04F3p0C77*
|
usb:v04F3p0C77*
|
||||||
|
usb:v04F3p0C7C*
|
||||||
|
usb:v04F3p0C7F*
|
||||||
|
usb:v04F3p0C80*
|
||||||
|
usb:v04F3p0C85*
|
||||||
|
usb:v04F3p0C90*
|
||||||
usb:v04F3p2706*
|
usb:v04F3p2706*
|
||||||
usb:v04F3p3032*
|
usb:v04F3p3032*
|
||||||
usb:v04F3p3057*
|
usb:v04F3p3057*
|
||||||
usb:v04F3p3104*
|
usb:v04F3p3104*
|
||||||
usb:v04F3p310D*
|
usb:v04F3p310D*
|
||||||
usb:v04F3p3128*
|
usb:v04F3p3128*
|
||||||
|
usb:v04F3p0C8A*
|
||||||
|
usb:v05BAp000E*
|
||||||
|
usb:v06CBp0051*
|
||||||
usb:v06CBp0081*
|
usb:v06CBp0081*
|
||||||
usb:v06CBp0088*
|
usb:v06CBp0088*
|
||||||
usb:v06CBp008A*
|
usb:v06CBp008A*
|
||||||
usb:v06CBp009A*
|
usb:v06CBp009A*
|
||||||
usb:v06CBp009B*
|
usb:v06CBp009B*
|
||||||
|
usb:v06CBp00A1*
|
||||||
usb:v06CBp00A2*
|
usb:v06CBp00A2*
|
||||||
usb:v06CBp00A8*
|
usb:v06CBp00A8*
|
||||||
usb:v06CBp00B7*
|
usb:v06CBp00B7*
|
||||||
usb:v06CBp00BB*
|
usb:v06CBp00BB*
|
||||||
|
usb:v06CBp00BC*
|
||||||
usb:v06CBp00BE*
|
usb:v06CBp00BE*
|
||||||
usb:v06CBp00C4*
|
|
||||||
usb:v06CBp00CB*
|
usb:v06CBp00CB*
|
||||||
usb:v06CBp00C9*
|
usb:v06CBp00C9*
|
||||||
usb:v06CBp00D8*
|
usb:v06CBp00D8*
|
||||||
@@ -342,8 +401,8 @@ usb:v06CBp00DA*
|
|||||||
usb:v06CBp00DC*
|
usb:v06CBp00DC*
|
||||||
usb:v06CBp00E4*
|
usb:v06CBp00E4*
|
||||||
usb:v06CBp00E7*
|
usb:v06CBp00E7*
|
||||||
usb:v06CBp00E9*
|
|
||||||
usb:v06CBp00FD*
|
usb:v06CBp00FD*
|
||||||
|
usb:v06CBp00FF*
|
||||||
usb:v0A5Cp5801*
|
usb:v0A5Cp5801*
|
||||||
usb:v0A5Cp5805*
|
usb:v0A5Cp5805*
|
||||||
usb:v0A5Cp5834*
|
usb:v0A5Cp5834*
|
||||||
@@ -353,10 +412,20 @@ usb:v0A5Cp5842*
|
|||||||
usb:v0A5Cp5843*
|
usb:v0A5Cp5843*
|
||||||
usb:v0A5Cp5844*
|
usb:v0A5Cp5844*
|
||||||
usb:v0A5Cp5845*
|
usb:v0A5Cp5845*
|
||||||
|
usb:v0A5Cp5860*
|
||||||
|
usb:v0A5Cp5863*
|
||||||
|
usb:v0A5Cp5864*
|
||||||
|
usb:v0A5Cp5865*
|
||||||
|
usb:v0A5Cp5866*
|
||||||
|
usb:v0A5Cp5867*
|
||||||
usb:v0BDAp5812*
|
usb:v0BDAp5812*
|
||||||
usb:v10A5p0007*
|
usb:v10A5p0007*
|
||||||
usb:v10A5p9200*
|
usb:v10A5p9200*
|
||||||
|
usb:v10A5p9201*
|
||||||
usb:v10A5p9800*
|
usb:v10A5p9800*
|
||||||
|
usb:v10A5pA120*
|
||||||
|
usb:v10A5pA900*
|
||||||
|
usb:v10A5pA921*
|
||||||
usb:v10A5pE340*
|
usb:v10A5pE340*
|
||||||
usb:v1188p9545*
|
usb:v1188p9545*
|
||||||
usb:v138Ap0007*
|
usb:v138Ap0007*
|
||||||
@@ -378,6 +447,9 @@ usb:v1C7Ap0300*
|
|||||||
usb:v1C7Ap0575*
|
usb:v1C7Ap0575*
|
||||||
usb:v1C7Ap0576*
|
usb:v1C7Ap0576*
|
||||||
usb:v1C7Ap0577*
|
usb:v1C7Ap0577*
|
||||||
|
usb:v1C7Ap057E*
|
||||||
|
usb:v2541p0236*
|
||||||
|
usb:v2541p9711*
|
||||||
usb:v27C6p5042*
|
usb:v27C6p5042*
|
||||||
usb:v27C6p5110*
|
usb:v27C6p5110*
|
||||||
usb:v27C6p5117*
|
usb:v27C6p5117*
|
||||||
@@ -406,11 +478,19 @@ usb:v27C6p5740*
|
|||||||
usb:v27C6p5E0A*
|
usb:v27C6p5E0A*
|
||||||
usb:v27C6p581A*
|
usb:v27C6p581A*
|
||||||
usb:v27C6p589A*
|
usb:v27C6p589A*
|
||||||
|
usb:v27C6p5F10*
|
||||||
|
usb:v27C6p5F91*
|
||||||
usb:v27C6p6382*
|
usb:v27C6p6382*
|
||||||
usb:v2808p9338*
|
usb:v2808p9338*
|
||||||
|
usb:v2808p9348*
|
||||||
usb:v2808p93A9*
|
usb:v2808p93A9*
|
||||||
|
usb:v2808pA658*
|
||||||
|
usb:v2808pC652*
|
||||||
|
usb:v2808pA553*
|
||||||
usb:v298Dp2020*
|
usb:v298Dp2020*
|
||||||
usb:v298Dp2033*
|
usb:v298Dp2033*
|
||||||
|
usb:v2DF0p0003*
|
||||||
|
usb:v3274p8012*
|
||||||
usb:v3538p0930*
|
usb:v3538p0930*
|
||||||
ID_AUTOSUSPEND=1
|
ID_AUTOSUSPEND=1
|
||||||
ID_PERSIST=0
|
ID_PERSIST=0
|
||||||
|
|||||||
Vendored
-10
@@ -1,10 +0,0 @@
|
|||||||
The libfprint-2-2 postinst script calls udevadmin trigger for all the supported
|
|
||||||
USB readers. The list of readers used in that file is generated using the gbp
|
|
||||||
import hook when `gbp import-orig` (via --uscan or with a tarball) is used.
|
|
||||||
|
|
||||||
Alternatively it can be called manually by using:
|
|
||||||
|
|
||||||
GBP_SOURCES_DIR=. debian/update-udev-triggers.sh
|
|
||||||
|
|
||||||
When preparing a new upstream release, this script should be called against the
|
|
||||||
upstream provided .hwdb file.
|
|
||||||
Vendored
-14
@@ -1,14 +0,0 @@
|
|||||||
### libfprint-TOD - libfprint for Touch OEM Drivers
|
|
||||||
|
|
||||||
This is a light fork of libfprint to expose internal Drivers API in order to
|
|
||||||
create drivers as shared libraries.
|
|
||||||
|
|
||||||
Fork is hosted at: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
|
|
||||||
|
|
||||||
Packaging for this is handled via gbp, so you need to make sure that you have
|
|
||||||
added the remote:
|
|
||||||
|
|
||||||
git remote add origin-tod https://gitlab.freedesktop.org/3v1n0/libfprint.git
|
|
||||||
git fetch origin-tod --tags
|
|
||||||
|
|
||||||
To get the latest tod release, just use `gbp import-orig --uscan`.
|
|
||||||
Vendored
-1012
File diff suppressed because it is too large
Load Diff
Vendored
-203
@@ -1,203 +0,0 @@
|
|||||||
Source: libfprint
|
|
||||||
Priority: optional
|
|
||||||
Section: libs
|
|
||||||
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
|
|
||||||
XSBC-Original-Maintainer: FingerForce Team <fingerforce-devel@lists.alioth.debian.org>
|
|
||||||
Uploaders: Marco Trevisan <marco@ubuntu.com>
|
|
||||||
Build-Depends: debhelper-compat (= 13),
|
|
||||||
gir1.2-gobject-2.0-dev <!nogir>,
|
|
||||||
gir1.2-gio-2.0-dev <!nogir>,
|
|
||||||
gobject-introspection,
|
|
||||||
gtk-doc-tools,
|
|
||||||
libcairo-dev <!nocheck>,
|
|
||||||
libgirepository1.0-dev,
|
|
||||||
libglib2.0-dev,
|
|
||||||
libgudev-1.0-dev,
|
|
||||||
libgusb-dev,
|
|
||||||
libnss3-dev,
|
|
||||||
libpixman-1-dev,
|
|
||||||
meson,
|
|
||||||
python3 <!nocheck>,
|
|
||||||
python3-cairo <!nocheck>,
|
|
||||||
python3-gi <!nocheck>,
|
|
||||||
systemd-dev,
|
|
||||||
umockdev <!nocheck>
|
|
||||||
Build-Depends-Indep: libglib2.0-doc <!nodoc>, libgusb-doc <!nodoc>
|
|
||||||
Standards-Version: 4.6.2
|
|
||||||
Homepage: https://www.freedesktop.org/wiki/Software/fprint/libfprint
|
|
||||||
Vcs-Browser: https://salsa.debian.org/ubuntu-dev-team/libfprint/tree/noble
|
|
||||||
Vcs-Git: https://salsa.debian.org/ubuntu-dev-team/libfprint.git -b noble
|
|
||||||
|
|
||||||
Package: libfprint-2-2
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}
|
|
||||||
Description: async fingerprint library of fprint project, shared libraries
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package provides shared libraries.
|
|
||||||
|
|
||||||
Package: libfprint-2-dev
|
|
||||||
Section: libdevel
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: same
|
|
||||||
Depends: gir1.2-fprint-2.0 (= ${binary:Version}),
|
|
||||||
libfprint-2-2 (= ${binary:Version}),
|
|
||||||
${misc:Depends},
|
|
||||||
${gir:Depends},
|
|
||||||
Provides: ${gir:Provides},
|
|
||||||
Suggests: libfprint-2-doc
|
|
||||||
Description: async fingerprint library of fprint project, development headers
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package provides development headers.
|
|
||||||
|
|
||||||
Package: libfprint-2-doc
|
|
||||||
Section: doc
|
|
||||||
Architecture: all
|
|
||||||
Multi-Arch: foreign
|
|
||||||
Depends: ${misc:Depends}
|
|
||||||
Description: async fingerprint library of fprint project, API documentation
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package provides the API documentation.
|
|
||||||
|
|
||||||
Package: gir1.2-fprint-2.0
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: same
|
|
||||||
Section: introspection
|
|
||||||
Depends: ${gir:Depends}, ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}
|
|
||||||
Description: async fingerprint library of fprint project, gir bindings
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package can be used by other packages using the GIRepository format to
|
|
||||||
generate dynamic bindings.
|
|
||||||
|
|
||||||
Package: libfprint-2-tod1
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: same
|
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}
|
|
||||||
Description: async fingerprint library of fprint project, drivers shared libraries
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package provides shared libraries for the TOD drivers.
|
|
||||||
|
|
||||||
Package: libfprint-2-tod-dev
|
|
||||||
Section: libdevel
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: same
|
|
||||||
Depends: libfprint-2-tod1 (= ${binary:Version}),
|
|
||||||
libfprint-2-dev (= ${binary:Version}),
|
|
||||||
libglib2.0-dev (>= 2.56),
|
|
||||||
libgudev-1.0-dev,
|
|
||||||
libgusb-dev (>= 0.2.0),
|
|
||||||
libpixman-1-dev,
|
|
||||||
libnss3-dev,
|
|
||||||
${misc:Depends}
|
|
||||||
Description: async fingerprint library of fprint project, drivers development headers
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package provides development headers for creating device drivers.
|
|
||||||
An example driver is available at:
|
|
||||||
https://gitlab.freedesktop.org/3v1n0/libfprint-tod-example-driver
|
|
||||||
|
|
||||||
Package: libfprint-2-tests
|
|
||||||
Architecture: any
|
|
||||||
Depends: gir1.2-fprint-2.0 (= ${binary:Version}),
|
|
||||||
libfprint-2-2 (= ${binary:Version}),
|
|
||||||
python3,
|
|
||||||
python3-cairo,
|
|
||||||
python3-gi,
|
|
||||||
umockdev,
|
|
||||||
${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Description: Tests for async fingerprint library of fprint project
|
|
||||||
The fprint project aims to support for consumer fingerprint reader devices.
|
|
||||||
.
|
|
||||||
Previously, Linux support for such devices has been scattered amongst different
|
|
||||||
projects (many incomplete) and inconsistent in that application developers
|
|
||||||
would have to implement support for each type of fingerprint reader separately.
|
|
||||||
The idea is to change that by providing a central system to support all the
|
|
||||||
fingerprint readers as it's possible to get hands on.
|
|
||||||
.
|
|
||||||
libfprint is the centre of efforts, this component does the dirty job of
|
|
||||||
talking to fingerprint reading devices, and processing fingerprint data.
|
|
||||||
.
|
|
||||||
This library depends on the new libusb, which performs asynchronous callbacks,
|
|
||||||
allowing fprint to perform non-blocking device tasks.
|
|
||||||
.
|
|
||||||
This package contains test programs, designed to be run as part of a
|
|
||||||
regression testsuite.
|
|
||||||
Vendored
-45
@@ -1,45 +0,0 @@
|
|||||||
This package was debianized by Ulises Vitulli <uvitulli@fi.uba.ar> on
|
|
||||||
Fri, 19 Sep 2008 05:14:30 -0300.
|
|
||||||
|
|
||||||
It was downloaded from <http://reactivated.net/fprint/wiki/Libfprint>
|
|
||||||
|
|
||||||
Upstream Authors, and Copyright:
|
|
||||||
|
|
||||||
Copyright © 2007 Daniel Drake <dsd@gentoo.org>
|
|
||||||
Copyright © 2006-2007 Timo Hoenig <thoenig@suse.de>
|
|
||||||
Copyright © 2006 Pavel Machek <pavel@suse.cz>
|
|
||||||
Copyright © 1999 Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
Copyright © 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
|
|
||||||
Copyright © 2007 Cyrille Bagard
|
|
||||||
Copyright © 2007 Vasily Khoruzhick
|
|
||||||
Copyright © 2007 Jan-Michael Brummer <buzz2@gmx.de>
|
|
||||||
Copyright © 2007 Anthony Bretaudeau <wxcover@users.sourceforge.net>
|
|
||||||
|
|
||||||
|
|
||||||
License:
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
The files under libfprint/nbis directory has this license:
|
|
||||||
|
|
||||||
This software was developed at the National Institute of Standards and
|
|
||||||
Technology (NIST) by employees of the Federal Government in the course
|
|
||||||
of their official duties. Pursuant to title 17 Section 105 of the
|
|
||||||
United States Code, this software is not subject to copyright protection
|
|
||||||
and is in the public domain. NIST assumes no responsibility whatsoever for
|
|
||||||
its use by other parties, and makes no guarantees, expressed or implied,
|
|
||||||
about its quality, reliability, or any other characteristic.
|
|
||||||
|
|
||||||
The Debian packaging is © 2008, Ulises Vitulli <uvitulli@fi.uba.ar> and is
|
|
||||||
licensed under the LGPL v2.1, see `/usr/share/common-licenses/LGPL-2.1'.
|
|
||||||
Vendored
-2
@@ -1,2 +0,0 @@
|
|||||||
NEWS
|
|
||||||
README.md
|
|
||||||
Vendored
-8
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
dch -v"$GBP_DEBIAN_VERSION" "New upstream release"
|
|
||||||
git add debian/changelog
|
|
||||||
debcommit
|
|
||||||
|
|
||||||
debian/update-udev-triggers.sh
|
|
||||||
Vendored
-19
@@ -1,19 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
pristine-tar = True
|
|
||||||
debian-branch = noble
|
|
||||||
upstream-vcs-tag = v%(version)s
|
|
||||||
upstream-branch = upstream-tod
|
|
||||||
debian-tag=ubuntu/%(version)s
|
|
||||||
|
|
||||||
[buildpackage]
|
|
||||||
sign-tags = True
|
|
||||||
|
|
||||||
[dch]
|
|
||||||
multimaint-merge = True
|
|
||||||
|
|
||||||
[import-orig]
|
|
||||||
postimport = debian/gbp-post-import-hook.sh
|
|
||||||
|
|
||||||
[pq]
|
|
||||||
patch-numbers = False
|
|
||||||
|
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
usr/lib/${DEB_HOST_MULTIARCH}/girepository-1.0/FPrint-*.typelib
|
|
||||||
Vendored
-3
@@ -1,3 +0,0 @@
|
|||||||
usr/lib/udev/hwdb.d/
|
|
||||||
usr/lib/udev/rules.d/
|
|
||||||
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9].so.*
|
|
||||||
-3
@@ -1,3 +0,0 @@
|
|||||||
# For security reasons, we don't want the fingerprint readers to be accessible
|
|
||||||
# by unprivileged users
|
|
||||||
udev-rule-missing-uaccess
|
|
||||||
Vendored
-315
@@ -1,315 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then
|
|
||||||
# apply hwdb rules at package installation, see
|
|
||||||
# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683863#27>
|
|
||||||
# NOTA BENE: after the DEBHELPER section since dh_installudev
|
|
||||||
# adds stuff there
|
|
||||||
# The devices ID list is auto-generated using the gbp postimport hook
|
|
||||||
# see debian/README.sources for more details.
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1600 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1660 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1680 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1681 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1682 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1683 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1684 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1685 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1686 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1687 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1688 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=1689 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=168f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2500 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2580 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2550 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2810 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2660 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2680 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2681 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2682 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2683 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2684 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2685 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2686 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2687 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2688 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2689 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=268f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=2691 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=5731 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=08ff --attr-match=idProduct=5501 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0570 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0571 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0582 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=05a1 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0903 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0907 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c01 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c02 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c03 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c04 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c05 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c06 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c07 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c08 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c09 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c0f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c10 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c11 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c12 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c13 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c14 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c15 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c16 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c17 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c18 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c19 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c1f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c20 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c21 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c22 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c23 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c24 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c25 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c26 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c27 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c28 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c29 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c2f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c30 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c31 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c32 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c33 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c3d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c42 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c63 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c6e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c58 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c7d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c7e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c82 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c88 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c8c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c8d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c99 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0603 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=9e48 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=d979 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=a959 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=ffe0 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=a305 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=da04 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=d805 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=d205 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5840 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6014 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6092 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6094 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=609c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60a2 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60a4 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=60bc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6304 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=631c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=633c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=634c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6384 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=639c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63ac || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63bc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=63cc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6496 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6582 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6584 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=658c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6592 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6594 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=659a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=659c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6a94 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=1010 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0bda --attr-match=idProduct=5813 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bd || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00df || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00f9 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00fc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c2 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0100 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00f0 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0103 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0123 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0124 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0126 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0129 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0168 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=015f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0104 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0173 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0106 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2016 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1000 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1001 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0483 --attr-match=idProduct=2015 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0483 --attr-match=idProduct=2017 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=3001 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=2020 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00bd || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=045e --attr-match=idProduct=00ca || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=0007 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=0008 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=05ba --attr-match=idProduct=000a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=061a --attr-match=idProduct=0110 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0050 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0001 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0005 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0008 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0010 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0011 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0015 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0017 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0018 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0091 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=047d --attr-match=idProduct=00f2 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04e8 --attr-match=idProduct=730b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=036b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c00 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c4c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c57 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c5e || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c5a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c6c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c70 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c72 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=0c77 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=2706 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3032 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3057 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3104 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=310d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=04f3 --attr-match=idProduct=3128 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0081 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=0088 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=008a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=009b || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00a2 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00a8 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00b7 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00bb || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00be || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c4 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00cb || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00c9 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00d8 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00da || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00dc || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e4 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e7 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00e9 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=06cb --attr-match=idProduct=00fd || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5801 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5805 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5834 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5840 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5841 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5842 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5843 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5844 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0a5c --attr-match=idProduct=5845 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=0bda --attr-match=idProduct=5812 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=0007 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=9200 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=9800 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=10a5 --attr-match=idProduct=e340 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1188 --attr-match=idProduct=9545 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0007 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=003f || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0090 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0092 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0094 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=0097 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=009d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=00ab || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=138a --attr-match=idProduct=00a6 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=147e --attr-match=idProduct=1002 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1491 --attr-match=idProduct=0088 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=16d1 --attr-match=idProduct=1027 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0300 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0575 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0576 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=1c7a --attr-match=idProduct=0577 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5042 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5110 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5117 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5120 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5125 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5201 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=521d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5301 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=530c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=532d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5335 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=533c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5381 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5385 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=538d || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5395 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5503 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=550a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=550c || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5584 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a2 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55a4 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=55b4 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5740 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=5e0a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=581a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=589a || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=27c6 --attr-match=idProduct=6382 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=9338 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=2808 --attr-match=idProduct=93a9 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=2020 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=298d --attr-match=idProduct=2033 || true
|
|
||||||
udevadm trigger --action=add --attr-match=idVendor=3538 --attr-match=idProduct=0930 || true
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
Vendored
-17
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
if [ "$1" = "configure" -o "$1" = "upgrade" ] && command -V udevadm >/dev/null 2>&1; then
|
|
||||||
# apply hwdb rules at package installation, see
|
|
||||||
# <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683863#27>
|
|
||||||
# NOTA BENE: after the DEBHELPER section since dh_installudev
|
|
||||||
# adds stuff there
|
|
||||||
# The devices ID list is auto-generated using the gbp postimport hook
|
|
||||||
# see debian/README.sources for more details.
|
|
||||||
@UDEVADM_TRIGGERS@
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
Vendored
-94
@@ -1,94 +0,0 @@
|
|||||||
libfprint-2.so.2 libfprint-2-2 #MINVER#
|
|
||||||
* Build-Depends-Package: libfprint-2-dev
|
|
||||||
LIBFPRINT_2.0.0@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_context_enumerate@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_context_get_devices@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_context_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_context_new@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_capture@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_capture_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_capture_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_clear_storage@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_clear_storage_finish@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_clear_storage_sync@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_close@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_close_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_close_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_delete_print@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_delete_print_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_delete_print_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_enroll@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_enroll_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_enroll_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_error_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_error_quark@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_feature_get_type@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_get_device_id@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_get_driver@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_get_features@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_get_finger_status@LIBFPRINT_2.0.0 1:1.90.4
|
|
||||||
fp_device_get_name@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_get_nr_enroll_stages@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_get_scan_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_get_temperature@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_has_feature@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_has_storage@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_identify@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_identify_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_identify_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_is_open@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_list_prints@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_list_prints_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_list_prints_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_open@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_open_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_open_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_resume@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_resume_finish@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_resume_sync@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_retry_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_retry_quark@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_supports_capture@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_supports_identify@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_suspend@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_suspend_finish@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_suspend_sync@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
fp_device_type_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_verify@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_verify_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_device_verify_sync@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_finger_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_finger_status_flags_get_type@LIBFPRINT_2.0.0 1:1.90.4
|
|
||||||
fp_image_detect_minutiae@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_detect_minutiae_finish@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_device_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_binarized@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_data@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_height@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_minutiae@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_ppmm@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_get_width@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_image_new@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_minutia_get_coords@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_compatible@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_deserialize@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_equal@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_description@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_device_id@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_device_stored@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_driver@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_enroll_date@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_finger@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_image@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_get_username@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_new@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_serialize@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_set_description@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_set_enroll_date@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_set_finger@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_print_set_username@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_scan_type_get_type@LIBFPRINT_2.0.0 1:1.90.1
|
|
||||||
fp_temperature_get_type@LIBFPRINT_2.0.0 1:1.94.1
|
|
||||||
Vendored
-4
@@ -1,4 +0,0 @@
|
|||||||
usr/include/libfprint-[0-9]/*.h
|
|
||||||
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9].so
|
|
||||||
usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libfprint-[0-9].pc
|
|
||||||
usr/share/gir-1.0/FPrint-*.gir
|
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
usr/share/gtk-doc/*/libfprint-*
|
|
||||||
Vendored
-2
@@ -1,2 +0,0 @@
|
|||||||
usr/libexec/installed-tests/libfprint-[0-9]
|
|
||||||
usr/share/installed-tests/libfprint-[0-9]
|
|
||||||
Vendored
-3
@@ -1,3 +0,0 @@
|
|||||||
usr/include/libfprint-[0-9]/tod-[0-9]/*
|
|
||||||
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9]-tod.so
|
|
||||||
usr/lib/${DEB_HOST_MULTIARCH}/pkgconfig/libfprint-[0-9]-tod-[0-9].pc
|
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
usr/lib/${DEB_HOST_MULTIARCH}/libfprint-[0-9]-tod.so.*
|
|
||||||
Vendored
-239
@@ -1,239 +0,0 @@
|
|||||||
libfprint-2-tod.so.1 libfprint-2-tod1 #MINVER#
|
|
||||||
LIBFPRINT_TOD_1.0.0@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
LIBFPRINT_TOD_1_1.92@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
LIBFPRINT_TOD_1_1.94@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
|
|
||||||
fpi_assemble_frames@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_assemble_lines@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_dup_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_dup_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_dup_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_dup_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_pos@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_remaining@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_sub_reader@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_get_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_init@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_masked_scan_uint32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_masked_scan_uint32_peek@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_sub_reader@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_peek_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_set_pos@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_skip@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_skip_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_skip_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_reader_skip_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_ensure_free_space@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_fill@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_free_and_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_get_remaining@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_init@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_init_with_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_init_with_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_new_with_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_new_with_size@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_float32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_float32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_float64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_float64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_int8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_string_utf16@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_string_utf32@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_string_utf8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint16_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint16_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint24_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint24_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint32_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint32_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint64_be@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint64_le@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_put_uint8@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_reset@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_byte_writer_reset_and_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_action_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_action_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_device_action_is_cancelled@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_add_timeout@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_capture_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_class_auto_initialize_features@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_device_clear_storage_complete@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_device_close_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_configure_wakeup@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_device_critical_enter@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
|
|
||||||
fpi_device_critical_leave@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
|
|
||||||
fpi_device_delete_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_enroll_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_enroll_progress@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_error_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_error_new_msg@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_cancellable@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_capture_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_current_action@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_delete_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_driver_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_enroll_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_identify_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_udev_data@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_device_get_usb_device@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_verify_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_get_virtual_env@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_identify_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_identify_report@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_list_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_open_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_probe_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_remove@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
|
|
||||||
fpi_device_report_finger_status@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
|
|
||||||
fpi_device_report_finger_status_changes@LIBFPRINT_TOD_1.0.0 1:1.90.5+tod1
|
|
||||||
fpi_device_resume@LIBFPRINT_TOD_1_1.94 1:1.94.5+tod1
|
|
||||||
fpi_device_resume_complete@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
|
|
||||||
fpi_device_retry_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_retry_new_msg@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_set_nr_enroll_stages@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_set_scan_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_suspend@LIBFPRINT_TOD_1_1.94 1:1.94.5+tod1
|
|
||||||
fpi_device_suspend_complete@LIBFPRINT_TOD_1_1.94 1:1.94.1+tod1
|
|
||||||
fpi_device_udev_subtype_flags_get_type@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_device_update_features@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_device_update_temp@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_device_verify_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_device_verify_report@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_do_movement_estimation@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_activate@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_activate_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_close_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_deactivate@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_deactivate_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_image_captured@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_open_complete@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_report_finger_status@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_retry_scan@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_session_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_set_bz3_threshold@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_image_device_state_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_image_flags_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_image_resize@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_match_result_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_mean_sq_diff_norm@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_add_from_image@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_add_print@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_bz3_match@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_fill_from_user_id@LIBFPRINT_TOD_1.0.0 1:1.90.2+tod1
|
|
||||||
fpi_print_generate_user_id@LIBFPRINT_TOD_1.0.0 1:1.90.2+tod1
|
|
||||||
fpi_print_set_device_stored@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_set_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_print_type_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_spi_transfer_get_type@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_new@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_read@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_read_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_ref@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_submit@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_submit_sync@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_unref@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_write@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_spi_transfer_write_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_cancel_delayed_state_change@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_dup_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_free@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_get_cur_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_get_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_get_device@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_get_error@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_jump_to_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_jump_to_state_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_jump_to_state_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_jump_to_state_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_ssm_mark_completed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_mark_completed_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_mark_completed_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_mark_completed_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_ssm_mark_failed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_new_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_new_full@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_new_full_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_ssm_next_state@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_next_state_delayed@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_next_state_delayed@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_next_state_delayed_1_90@LIBFPRINT_TOD_1.0.0 1:1.94.1+tod1
|
|
||||||
fpi_ssm_set_data@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_silence_debug@LIBFPRINT_TOD_1_1.94 1:1.94.3+tod1
|
|
||||||
fpi_ssm_spi_transfer_cb@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_spi_transfer_with_weak_pointer_cb@LIBFPRINT_TOD_1_1.92 1:1.94.1+tod1
|
|
||||||
fpi_ssm_start@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_start_subsm@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_usb_transfer_cb@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_ssm_usb_transfer_with_weak_pointer_cb@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_std_sq_dev@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_transfer_type_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.3+tod1
|
|
||||||
fpi_usb_transfer_fill_bulk@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_fill_bulk_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_fill_control@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_fill_interrupt@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_fill_interrupt_full@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_get_type@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_new@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_ref@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_submit@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_submit_sync@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
fpi_usb_transfer_unref@LIBFPRINT_TOD_1.0.0 1:1.90.1+tod1
|
|
||||||
-37
@@ -1,37 +0,0 @@
|
|||||||
From a603b95786836d27679301ecd4e68e4227ab4c82 Mon Sep 17 00:00:00 2001
|
|
||||||
From: herman lin <herman.lin@emc.com.tw>
|
|
||||||
Date: Thu, 8 May 2025 15:34:37 +0800
|
|
||||||
Subject: [PATCH] elanmoc: Add new PID 0x0CA8
|
|
||||||
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 1 +
|
|
||||||
libfprint/drivers/elanmoc/elanmoc.c | 1 +
|
|
||||||
2 files changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 39dd316..43190cb 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -157,6 +157,7 @@ usb:v04F3p0C8C*
|
|
||||||
usb:v04F3p0C8D*
|
|
||||||
usb:v04F3p0C99*
|
|
||||||
usb:v04F3p0C9F*
|
|
||||||
+usb:v04F3p0CA8*
|
|
||||||
ID_AUTOSUSPEND=1
|
|
||||||
ID_PERSIST=0
|
|
||||||
|
|
||||||
diff --git a/libfprint/drivers/elanmoc/elanmoc.c b/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
index 42a84a6..0e99e57 100644
|
|
||||||
--- a/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
+++ b/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
@@ -33,6 +33,7 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c99, },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c9f, },
|
|
||||||
+ { .vid = 0x04f3, .pid = 0x0ca8, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
|
||||||
};
|
|
||||||
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
Subject: elanmoc: Add new PID 0x0C9F
|
|
||||||
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/merge_requests/501
|
|
||||||
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/libfprint/+bug/2089367
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 8e0e6eab12e772058a8957a2b9f2d39e0bdc8e11..342c6d0e6538028d90a11d1607cd9e07086aeb8c 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -156,6 +156,7 @@ usb:v04F3p0C88*
|
|
||||||
usb:v04F3p0C8C*
|
|
||||||
usb:v04F3p0C8D*
|
|
||||||
usb:v04F3p0C99*
|
|
||||||
+usb:v04F3p0C9F*
|
|
||||||
ID_AUTOSUSPEND=1
|
|
||||||
ID_PERSIST=0
|
|
||||||
|
|
||||||
diff --git a/libfprint/drivers/elanmoc/elanmoc.c b/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
index e86b79a28ec2240a303ad602b567d10447e3b09b..42a84a627e68020bb070bce1a6cffa669cffe9ed 100644
|
|
||||||
--- a/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
+++ b/libfprint/drivers/elanmoc/elanmoc.c
|
|
||||||
@@ -32,6 +32,7 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c8c, },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
|
||||||
{ .vid = 0x04f3, .pid = 0x0c99, },
|
|
||||||
+ { .vid = 0x04f3, .pid = 0x0c9f, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
From 763b6830006ca88bced7744c219c9a961d1637f4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: jialei <jialei@egoodix.com>
|
|
||||||
Date: Wed, 29 Oct 2025 14:32:54 +0800
|
|
||||||
Subject: [PATCH] goodixmoc:add new PID 0x66A9
|
|
||||||
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 1 +
|
|
||||||
libfprint/drivers/goodixmoc/goodix.c | 1 +
|
|
||||||
2 files changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 74ac65b..df18494 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -207,6 +207,7 @@ usb:v27C6p6594*
|
|
||||||
usb:v27C6p659A*
|
|
||||||
usb:v27C6p659C*
|
|
||||||
usb:v27C6p6A94*
|
|
||||||
+usb:v27C6p66A9*
|
|
||||||
ID_AUTOSUSPEND=1
|
|
||||||
ID_PERSIST=0
|
|
||||||
|
|
||||||
diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c
|
|
||||||
index 5a3ffac..8aea175 100644
|
|
||||||
--- a/libfprint/drivers/goodixmoc/goodix.c
|
|
||||||
+++ b/libfprint/drivers/goodixmoc/goodix.c
|
|
||||||
@@ -1632,6 +1632,7 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = 0x27c6, .pid = 0x659A, },
|
|
||||||
{ .vid = 0x27c6, .pid = 0x659C, },
|
|
||||||
{ .vid = 0x27c6, .pid = 0x6A94, },
|
|
||||||
+ { .vid = 0x27c6, .pid = 0x66A9, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
|
||||||
};
|
|
||||||
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
-44
@@ -1,44 +0,0 @@
|
|||||||
From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
|
|
||||||
Date: Wed, 22 May 2024 17:08:19 +0200
|
|
||||||
Subject: libfprint-fprint-list-udev-hwdb: Add new broadcom device IDs
|
|
||||||
|
|
||||||
(cherry picked from commit eaec2339ccaee64b2bdb1d1e27f51ada673e4087)
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 6 ++++++
|
|
||||||
libfprint/fprint-list-udev-hwdb.c | 6 ++++++
|
|
||||||
2 files changed, 12 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 74ac65b..cb3e74b 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -353,6 +353,12 @@ usb:v0A5Cp5842*
|
|
||||||
usb:v0A5Cp5843*
|
|
||||||
usb:v0A5Cp5844*
|
|
||||||
usb:v0A5Cp5845*
|
|
||||||
+usb:v0A5Cp5860*
|
|
||||||
+usb:v0A5Cp5863*
|
|
||||||
+usb:v0A5Cp5864*
|
|
||||||
+usb:v0A5Cp5865*
|
|
||||||
+usb:v0A5Cp5866*
|
|
||||||
+usb:v0A5Cp5867*
|
|
||||||
usb:v0BDAp5812*
|
|
||||||
usb:v10A5p0007*
|
|
||||||
usb:v10A5p9200*
|
|
||||||
diff --git a/libfprint/fprint-list-udev-hwdb.c b/libfprint/fprint-list-udev-hwdb.c
|
|
||||||
index bace9f9..4d056ae 100644
|
|
||||||
--- a/libfprint/fprint-list-udev-hwdb.c
|
|
||||||
+++ b/libfprint/fprint-list-udev-hwdb.c
|
|
||||||
@@ -76,6 +76,12 @@ static const FpIdEntry allowlist_id_table[] = {
|
|
||||||
{ .vid = 0x0a5c, .pid = 0x5843 },
|
|
||||||
{ .vid = 0x0a5c, .pid = 0x5844 },
|
|
||||||
{ .vid = 0x0a5c, .pid = 0x5845 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5860 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5863 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5864 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5865 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5866 },
|
|
||||||
+ { .vid = 0x0a5c, .pid = 0x5867 },
|
|
||||||
{ .vid = 0x0bda, .pid = 0x5812 },
|
|
||||||
{ .vid = 0x10a5, .pid = 0x0007 },
|
|
||||||
{ .vid = 0x10a5, .pid = 0x9200 },
|
|
||||||
Vendored
-7
@@ -1,7 +0,0 @@
|
|||||||
libfprint-fprint-list-udev-hwdb-Add-new-broadcom-device-I.patch
|
|
||||||
elanmoc-add-new-pid-0x0c9f.patch
|
|
||||||
synaptics-Add-new-PID-0x0107-and-0x108.patch
|
|
||||||
synaptics-Add-new-PID-0x019D.patch
|
|
||||||
synaptics-add-new-PID-0x019F-0x109-and-0x10A.patch
|
|
||||||
goodixmoc-add-new-PID-0x66A9.patch
|
|
||||||
elanmoc-Add-new-PID-0x0CA8.patch
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
From a8ef1672a4ca7e60760349ce320a8f5b778244d5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Aris Lin <aris.lin@synaptics.com>
|
|
||||||
Date: Mon, 18 Nov 2024 11:18:29 +0800
|
|
||||||
Subject: [PATCH] synaptics: Add new PID 0x0107 and 0x108
|
|
||||||
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 2 ++
|
|
||||||
libfprint/drivers/synaptics/synaptics.c | 2 ++
|
|
||||||
2 files changed, 4 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 74ac65b..386d8bd 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -229,6 +229,8 @@ usb:v06CBp00C2*
|
|
||||||
usb:v06CBp0100*
|
|
||||||
usb:v06CBp00F0*
|
|
||||||
usb:v06CBp0103*
|
|
||||||
+usb:v06CBp0107*
|
|
||||||
+usb:v06CBp0108*
|
|
||||||
usb:v06CBp0123*
|
|
||||||
usb:v06CBp0124*
|
|
||||||
usb:v06CBp0126*
|
|
||||||
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
index 138e734..a5d2990 100644
|
|
||||||
--- a/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
+++ b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
@@ -39,6 +39,8 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
From 2e766904f0250873aaa2133f5d0e84440843ec8b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Aris Lin <aris.lin@synaptics.com>
|
|
||||||
Date: Mon, 13 May 2024 16:21:57 +0800
|
|
||||||
Subject: [PATCH] synaptics: Add new PID 0x019D
|
|
||||||
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/2e766904f0250873aaa2133f5d0e84440843ec8b
|
|
||||||
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2114712
|
|
||||||
Signed-off-by: Atlas Yu <atlas.yu@canonical.com>
|
|
||||||
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 1 +
|
|
||||||
libfprint/drivers/synaptics/synaptics.c | 1 +
|
|
||||||
2 files changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 342c6d0..ef81674 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -243,6 +243,7 @@ usb:v06CBp015F*
|
|
||||||
usb:v06CBp0104*
|
|
||||||
usb:v06CBp0173*
|
|
||||||
usb:v06CBp0106*
|
|
||||||
+usb:v06CBp019D*
|
|
||||||
ID_AUTOSUSPEND=1
|
|
||||||
ID_PERSIST=0
|
|
||||||
|
|
||||||
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
index 138e734..7b7bf73 100644
|
|
||||||
--- a/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
+++ b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
@@ -48,6 +48,7 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
|
||||||
};
|
|
||||||
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
From: Aris Lin <aris.lin@synaptics.com>
|
|
||||||
Date: Mon, 14 Jul 2025 11:52:56 +0800
|
|
||||||
Subject: [PATCH] synaptics: add new PID 0x019F, 0x109 and 0x10A
|
|
||||||
|
|
||||||
Origin: upstream, https://gitlab.freedesktop.org/libfprint/libfprint/-/commit/7f5304d6eec37955c8d462e571c3d72af0be4684
|
|
||||||
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2133704
|
|
||||||
Signed-off-by: Bin Li <binli@ubuntu.com>
|
|
||||||
---
|
|
||||||
data/autosuspend.hwdb | 3 +++
|
|
||||||
libfprint/drivers/synaptics/synaptics.c | 3 +++
|
|
||||||
2 files changed, 6 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/data/autosuspend.hwdb b/data/autosuspend.hwdb
|
|
||||||
index 7a1759e..10e643c 100644
|
|
||||||
--- a/data/autosuspend.hwdb
|
|
||||||
+++ b/data/autosuspend.hwdb
|
|
||||||
@@ -232,6 +232,8 @@ usb:v06CBp00F0*
|
|
||||||
usb:v06CBp0103*
|
|
||||||
usb:v06CBp0107*
|
|
||||||
usb:v06CBp0108*
|
|
||||||
+usb:v06CBp0109*
|
|
||||||
+usb:v06CBp010A*
|
|
||||||
usb:v06CBp0123*
|
|
||||||
usb:v06CBp0124*
|
|
||||||
usb:v06CBp0126*
|
|
||||||
@@ -242,6 +244,7 @@ usb:v06CBp0104*
|
|
||||||
usb:v06CBp0173*
|
|
||||||
usb:v06CBp0106*
|
|
||||||
usb:v06CBp019D*
|
|
||||||
+usb:v06CBp019F*
|
|
||||||
ID_AUTOSUSPEND=1
|
|
||||||
ID_PERSIST=0
|
|
||||||
|
|
||||||
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
index d272421..29fb5f1 100644
|
|
||||||
--- a/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
+++ b/libfprint/drivers/synaptics/synaptics.c
|
|
||||||
@@ -41,6 +41,8 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0109, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x010A, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
|
||||||
@@ -51,6 +53,7 @@ static const FpIdEntry id_table[] = {
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
|
|
||||||
+ { .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019F, },
|
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
|
||||||
};
|
|
||||||
|
|
||||||
Vendored
-26
@@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS = optimize=-lto
|
|
||||||
export DPKG_GENSYMBOLS_CHECK_LEVEL = 2
|
|
||||||
|
|
||||||
BUILDDIR = $(CURDIR)/obj-$(DEB_HOST_GNU_TYPE)
|
|
||||||
|
|
||||||
# Configuration arguments
|
|
||||||
CONFIG_ARGS = \
|
|
||||||
-Dudev_hwdb=enabled \
|
|
||||||
-Dudev_rules=enabled \
|
|
||||||
-Ddrivers=all \
|
|
||||||
-Dgtk-examples=false
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --with gir
|
|
||||||
|
|
||||||
override_dh_auto_configure:
|
|
||||||
dh_auto_configure -- $(CONFIG_ARGS)
|
|
||||||
|
|
||||||
override_dh_auto_test:
|
|
||||||
dh_auto_test -- -C $(BUILDDIR) --timeout-multiplier 5
|
|
||||||
|
|
||||||
override_dh_auto_clean:
|
|
||||||
rm -rf tests/__pycache__
|
|
||||||
dh_auto_clean
|
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
3.0 (quilt)
|
|
||||||
Vendored
-3
@@ -1,3 +0,0 @@
|
|||||||
# This TOD driver binary is built using sources inside this package
|
|
||||||
# but at previous version, see tests/tod-drivers/README.md for more information
|
|
||||||
libfprint source: source-is-missing [tests/tod-drivers/tod-*.so]
|
|
||||||
Vendored
-6
@@ -1,6 +0,0 @@
|
|||||||
Test-Command: gnome-desktop-testing-runner libfprint-2
|
|
||||||
Features: test-name=installed-tests
|
|
||||||
Classes: desktop
|
|
||||||
Depends: gnome-desktop-testing,
|
|
||||||
libfprint-2-tests
|
|
||||||
Restrictions: allow-stderr
|
|
||||||
Vendored
-32
@@ -1,32 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
srcdir="${GBP_SOURCES_DIR:-.}"
|
|
||||||
debpath="$(dirname "$0")"
|
|
||||||
autosuspend_file="$srcdir/data/autosuspend.hwdb"
|
|
||||||
commands_lines=()
|
|
||||||
|
|
||||||
while IFS= read -r line; do
|
|
||||||
if [[ $line =~ ^usb:v([A-Fa-f0-9]{4})p([A-Fa-f0-9]{4}) ]]; then
|
|
||||||
vendor="$(echo "${BASH_REMATCH[1]}" | tr '[:upper:]' '[:lower:]')"
|
|
||||||
product="$(echo "${BASH_REMATCH[2]}" | tr '[:upper:]' '[:lower:]')"
|
|
||||||
commands_lines+=("\tudevadm trigger --action=add --attr-match=idVendor=$vendor --attr-match=idProduct=$product || true")
|
|
||||||
fi
|
|
||||||
done < "$autosuspend_file"
|
|
||||||
|
|
||||||
UDEVADM_TRIGGERS=$( IFS=$'\n'; echo -e "${commands_lines[*]}" )
|
|
||||||
export UDEVADM_TRIGGERS
|
|
||||||
|
|
||||||
for i in "$debpath"/libfprint-*.post*.in; do
|
|
||||||
out="${i%.in}"
|
|
||||||
perl -pe 's/\@UDEVADM_TRIGGERS\@/`printenv UDEVADM_TRIGGERS`/e' "$i" > "$out"
|
|
||||||
|
|
||||||
if [ -n "$GBP_BRANCH" ]; then
|
|
||||||
if ! git diff-index --quiet HEAD -- "$out"; then
|
|
||||||
git add "$out"
|
|
||||||
dch "${out#$srcdir}: Devices triggers updated"
|
|
||||||
git add debian/changelog
|
|
||||||
debcommit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
Vendored
-4
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
Bug-Database: https://gitlab.freedesktop.org/3v1n0/libfprint/-/issues
|
|
||||||
Bug-Submit: https://gitlab.freedesktop.org/3v1n0/libfprint/-/issues/new
|
|
||||||
Repository-Browse: https://gitlab.freedesktop.org/3v1n0/libfprint/tree/tod
|
|
||||||
Vendored
-5
@@ -1,5 +0,0 @@
|
|||||||
version=4
|
|
||||||
|
|
||||||
opts=versionmangle=s/_/./g \
|
|
||||||
https://gitlab.freedesktop.org/3v1n0/@PACKAGE@/tags \
|
|
||||||
.*\/archive\/[Vv]_?([\d_\+\.]+(?:\+git[0-9]+)?\+tod[0-9]+)\/@PACKAGE@-.*@ARCHIVE_EXT@
|
|
||||||
@@ -101,11 +101,14 @@ plot_minutiae (unsigned char *rgbdata,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define write_pixel(num) do { \
|
#define write_pixel(num) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
rgbdata[((num) * 3)] = 0xff; \
|
rgbdata[((num) * 3)] = 0xff; \
|
||||||
rgbdata[((num) * 3) + 1] = 0; \
|
rgbdata[((num) * 3) + 1] = 0; \
|
||||||
rgbdata[((num) * 3) + 2] = 0; \
|
rgbdata[((num) * 3) + 2] = 0; \
|
||||||
} while(0)
|
} \
|
||||||
|
while(0)
|
||||||
|
|
||||||
for (i = 0; i < minutiae->len; i++)
|
for (i = 0; i < minutiae->len; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -100,6 +100,12 @@ FP_TYPE_IMAGE_DEVICE
|
|||||||
FpImageDevice
|
FpImageDevice
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>fp-sdcp-device</FILE>
|
||||||
|
FP_TYPE_SDCP_DEVICE
|
||||||
|
FpSdcpDevice
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>fp-print</FILE>
|
<FILE>fp-print</FILE>
|
||||||
FP_TYPE_PRINT
|
FP_TYPE_PRINT
|
||||||
@@ -215,6 +221,31 @@ fpi_image_device_retry_scan
|
|||||||
fpi_image_device_set_bz3_threshold
|
fpi_image_device_set_bz3_threshold
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>fpi-sdcp-device</FILE>
|
||||||
|
<TITLE>Internal FpSdcpDevice</TITLE>
|
||||||
|
FpiSdcpClaim
|
||||||
|
FpSdcpDeviceClass
|
||||||
|
fpi_sdcp_claim_get_type
|
||||||
|
fpi_sdcp_claim_new
|
||||||
|
fpi_sdcp_claim_copy
|
||||||
|
fpi_sdcp_claim_free
|
||||||
|
fpi_sdcp_device_open_complete
|
||||||
|
fpi_sdcp_device_get_connect_data
|
||||||
|
fpi_sdcp_device_connect_complete
|
||||||
|
fpi_sdcp_device_get_reconnect_data
|
||||||
|
fpi_sdcp_device_reconnect_complete
|
||||||
|
fpi_sdcp_device_list_complete
|
||||||
|
fpi_sdcp_device_enroll_commit
|
||||||
|
fpi_sdcp_device_enroll_commit_complete
|
||||||
|
fpi_sdcp_device_get_identify_data
|
||||||
|
fpi_sdcp_device_set_identify_data
|
||||||
|
fpi_sdcp_device_identify_retry
|
||||||
|
fpi_sdcp_device_identify_complete
|
||||||
|
fpi_sdcp_device_get_print_id
|
||||||
|
fpi_sdcp_device_set_print_id
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>fpi-log</FILE>
|
<FILE>fpi-log</FILE>
|
||||||
fp_dbg
|
fp_dbg
|
||||||
@@ -223,6 +254,8 @@ fp_warn
|
|||||||
fp_err
|
fp_err
|
||||||
BUG_ON
|
BUG_ON
|
||||||
BUG
|
BUG
|
||||||
|
fp_dbg_hex_dump_bytes
|
||||||
|
fp_dbg_hex_dump_gbytes
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
<xi:include href="xml/fp-context.xml"/>
|
<xi:include href="xml/fp-context.xml"/>
|
||||||
<xi:include href="xml/fp-device.xml"/>
|
<xi:include href="xml/fp-device.xml"/>
|
||||||
<xi:include href="xml/fp-image-device.xml"/>
|
<xi:include href="xml/fp-image-device.xml"/>
|
||||||
|
<xi:include href="xml/fp-sdcp-device.xml"/>
|
||||||
<xi:include href="xml/fp-print.xml"/>
|
<xi:include href="xml/fp-print.xml"/>
|
||||||
<xi:include href="xml/fp-image.xml"/>
|
<xi:include href="xml/fp-image.xml"/>
|
||||||
</part>
|
</part>
|
||||||
@@ -38,6 +39,7 @@
|
|||||||
<title>Device methods for drivers</title>
|
<title>Device methods for drivers</title>
|
||||||
<xi:include href="xml/fpi-device.xml"/>
|
<xi:include href="xml/fpi-device.xml"/>
|
||||||
<xi:include href="xml/fpi-image-device.xml"/>
|
<xi:include href="xml/fpi-image-device.xml"/>
|
||||||
|
<xi:include href="xml/fpi-sdcp-device.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="driver-helpers">
|
<chapter id="driver-helpers">
|
||||||
|
|||||||
@@ -0,0 +1,208 @@
|
|||||||
|
/*
|
||||||
|
* Example storage clearing program, which deletes all the
|
||||||
|
* fingers which have been previously enrolled to disk.
|
||||||
|
* Copyright (C) 2020 Marco Trevisan <marco.trevisan@canonical.com>
|
||||||
|
* Copyright (C) 2024 Abhinav Baid <abhinavbaid@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FP_COMPONENT "example-clear-storage"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <libfprint/fprint.h>
|
||||||
|
#include <glib-unix.h>
|
||||||
|
|
||||||
|
#include "storage.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
typedef struct _ClearStorageData
|
||||||
|
{
|
||||||
|
GMainLoop *loop;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
unsigned int sigint_handler;
|
||||||
|
int ret_value;
|
||||||
|
} ClearStorageData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_storage_data_free (ClearStorageData *clear_storage_data)
|
||||||
|
{
|
||||||
|
g_clear_handle_id (&clear_storage_data->sigint_handler, g_source_remove);
|
||||||
|
g_clear_object (&clear_storage_data->cancellable);
|
||||||
|
g_main_loop_unref (clear_storage_data->loop);
|
||||||
|
g_free (clear_storage_data);
|
||||||
|
}
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClearStorageData, clear_storage_data_free)
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_device_closed (FpDevice *dev, GAsyncResult *res, void *user_data)
|
||||||
|
{
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
ClearStorageData *clear_storage_data = user_data;
|
||||||
|
|
||||||
|
fp_device_close_finish (dev, res, &error);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
g_warning ("Failed closing device %s", error->message);
|
||||||
|
|
||||||
|
g_main_loop_quit (clear_storage_data->loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_storage_quit (FpDevice *dev,
|
||||||
|
ClearStorageData *clear_storage_data)
|
||||||
|
{
|
||||||
|
if (!fp_device_is_open (dev))
|
||||||
|
{
|
||||||
|
g_main_loop_quit (clear_storage_data->loop);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fp_device_close (dev, NULL, (GAsyncReadyCallback) on_device_closed,
|
||||||
|
clear_storage_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_clear_storage_completed (FpDevice *dev, GAsyncResult *res, void *user_data)
|
||||||
|
{
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
ClearStorageData *clear_storage_data = user_data;
|
||||||
|
|
||||||
|
if (fp_device_clear_storage_finish (dev, res, &error))
|
||||||
|
{
|
||||||
|
if (!clear_saved_prints (dev, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Clear saved prints from local storage failed: %s",
|
||||||
|
error->message);
|
||||||
|
clear_storage_data->ret_value = EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_print ("Clear storage successful!\n");
|
||||||
|
clear_storage_data->ret_value = EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_storage_quit (dev, clear_storage_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_warning ("Failed to clear storage: %s", error->message);
|
||||||
|
clear_storage_data->ret_value = EXIT_FAILURE;
|
||||||
|
|
||||||
|
if (g_error_matches (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_SUPPORTED))
|
||||||
|
{
|
||||||
|
g_autoptr(GError) clear_error = NULL;
|
||||||
|
|
||||||
|
if (clear_saved_prints (dev, &clear_error))
|
||||||
|
clear_storage_data->ret_value = EXIT_SUCCESS;
|
||||||
|
else
|
||||||
|
g_warning ("Clear saved prints from local storage failed: %s",
|
||||||
|
clear_error->message);
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_storage_quit (dev, clear_storage_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
start_clear_storage (FpDevice *dev, ClearStorageData *clear_storage_data)
|
||||||
|
{
|
||||||
|
char buffer[20];
|
||||||
|
|
||||||
|
g_print ("Clear device storage? [Y/n]? ");
|
||||||
|
if (fgets (buffer, sizeof (buffer), stdin) &&
|
||||||
|
(buffer[0] == 'Y' || buffer[0] == 'y'))
|
||||||
|
{
|
||||||
|
fp_device_clear_storage (dev, clear_storage_data->cancellable,
|
||||||
|
(GAsyncReadyCallback) on_clear_storage_completed,
|
||||||
|
clear_storage_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_storage_quit (dev, clear_storage_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_device_opened (FpDevice *dev, GAsyncResult *res, void *user_data)
|
||||||
|
{
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
ClearStorageData *clear_storage_data = user_data;
|
||||||
|
|
||||||
|
if (!fp_device_open_finish (dev, res, &error))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to open device: %s", error->message);
|
||||||
|
clear_storage_quit (dev, clear_storage_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_print ("Opened device. ");
|
||||||
|
|
||||||
|
start_clear_storage (dev, clear_storage_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
sigint_cb (void *user_data)
|
||||||
|
{
|
||||||
|
ClearStorageData *clear_storage_data = user_data;
|
||||||
|
|
||||||
|
g_cancellable_cancel (clear_storage_data->cancellable);
|
||||||
|
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
g_autoptr(FpContext) ctx = NULL;
|
||||||
|
g_autoptr(ClearStorageData) clear_storage_data = NULL;
|
||||||
|
GPtrArray *devices;
|
||||||
|
FpDevice *dev;
|
||||||
|
|
||||||
|
setenv ("G_MESSAGES_DEBUG", "all", 0);
|
||||||
|
setenv ("LIBUSB_DEBUG", "3", 0);
|
||||||
|
|
||||||
|
ctx = fp_context_new ();
|
||||||
|
|
||||||
|
devices = fp_context_get_devices (ctx);
|
||||||
|
if (!devices)
|
||||||
|
{
|
||||||
|
g_warning ("Impossible to get devices");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev = discover_device (devices);
|
||||||
|
if (!dev)
|
||||||
|
{
|
||||||
|
g_warning ("No devices detected.");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_storage_data = g_new0 (ClearStorageData, 1);
|
||||||
|
clear_storage_data->ret_value = EXIT_FAILURE;
|
||||||
|
clear_storage_data->loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
clear_storage_data->cancellable = g_cancellable_new ();
|
||||||
|
clear_storage_data->sigint_handler = g_unix_signal_add_full (G_PRIORITY_HIGH,
|
||||||
|
SIGINT,
|
||||||
|
sigint_cb,
|
||||||
|
clear_storage_data,
|
||||||
|
NULL);
|
||||||
|
fp_device_open (dev, clear_storage_data->cancellable,
|
||||||
|
(GAsyncReadyCallback) on_device_opened,
|
||||||
|
clear_storage_data);
|
||||||
|
|
||||||
|
g_main_loop_run (clear_storage_data->loop);
|
||||||
|
|
||||||
|
return clear_storage_data->ret_value;
|
||||||
|
}
|
||||||
+1
-10
@@ -5,6 +5,7 @@ examples = [
|
|||||||
'img-capture',
|
'img-capture',
|
||||||
'manage-prints',
|
'manage-prints',
|
||||||
'verify',
|
'verify',
|
||||||
|
'clear-storage',
|
||||||
]
|
]
|
||||||
|
|
||||||
foreach example: examples
|
foreach example: examples
|
||||||
@@ -26,13 +27,3 @@ if installed_tests
|
|||||||
install_subdir('prints',
|
install_subdir('prints',
|
||||||
install_dir: installed_tests_testdir)
|
install_dir: installed_tests_testdir)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if get_option('tod')
|
|
||||||
executable('tod-inspector',
|
|
||||||
sources: 'tod-inspector.c',
|
|
||||||
dependencies: [
|
|
||||||
libfprint_dep,
|
|
||||||
tod_dep,
|
|
||||||
],
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
|
|||||||
+63
-5
@@ -26,6 +26,7 @@
|
|||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <glib/gstdio.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -55,6 +56,18 @@ get_print_data_descriptor (FpPrint *print, FpDevice *dev, FpFinger finger)
|
|||||||
finger);
|
finger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_print_prefix_for_device (FpDevice *dev)
|
||||||
|
{
|
||||||
|
const char *driver;
|
||||||
|
const char *dev_id;
|
||||||
|
|
||||||
|
driver = fp_device_get_driver (dev);
|
||||||
|
dev_id = fp_device_get_device_id (dev);
|
||||||
|
|
||||||
|
return g_strdup_printf ("%s/%s/", driver, dev_id);
|
||||||
|
}
|
||||||
|
|
||||||
static GVariantDict *
|
static GVariantDict *
|
||||||
load_data (void)
|
load_data (void)
|
||||||
{
|
{
|
||||||
@@ -169,8 +182,6 @@ gallery_data_load (FpDevice *dev)
|
|||||||
g_autoptr(GVariant) dict_variant = NULL;
|
g_autoptr(GVariant) dict_variant = NULL;
|
||||||
g_autofree char *dev_prefix = NULL;
|
g_autofree char *dev_prefix = NULL;
|
||||||
GPtrArray *gallery;
|
GPtrArray *gallery;
|
||||||
const char *driver;
|
|
||||||
const char *dev_id;
|
|
||||||
GVariantIter iter;
|
GVariantIter iter;
|
||||||
GVariant *value;
|
GVariant *value;
|
||||||
gchar *key;
|
gchar *key;
|
||||||
@@ -178,9 +189,7 @@ gallery_data_load (FpDevice *dev)
|
|||||||
gallery = g_ptr_array_new_with_free_func (g_object_unref);
|
gallery = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
dict = load_data ();
|
dict = load_data ();
|
||||||
dict_variant = g_variant_dict_end (dict);
|
dict_variant = g_variant_dict_end (dict);
|
||||||
driver = fp_device_get_driver (dev);
|
dev_prefix = get_print_prefix_for_device (dev);
|
||||||
dev_id = fp_device_get_device_id (dev);
|
|
||||||
dev_prefix = g_strdup_printf ("%s/%s/", driver, dev_id);
|
|
||||||
|
|
||||||
g_variant_iter_init (&iter, dict_variant);
|
g_variant_iter_init (&iter, dict_variant);
|
||||||
while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
|
while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
|
||||||
@@ -208,6 +217,55 @@ gallery_data_load (FpDevice *dev)
|
|||||||
return gallery;
|
return gallery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
clear_saved_prints (FpDevice *dev,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_autoptr(GVariantDict) dict = NULL;
|
||||||
|
g_autoptr(GVariantDict) updated_dict = NULL;
|
||||||
|
g_autoptr(GVariant) dict_variant = NULL;
|
||||||
|
g_autofree char *dev_prefix = NULL;
|
||||||
|
GPtrArray *print_keys;
|
||||||
|
GVariantIter iter;
|
||||||
|
GVariant *value;
|
||||||
|
gchar *key;
|
||||||
|
|
||||||
|
print_keys = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
dict = load_data ();
|
||||||
|
dict_variant = g_variant_dict_end (dict);
|
||||||
|
dev_prefix = get_print_prefix_for_device (dev);
|
||||||
|
|
||||||
|
g_variant_iter_init (&iter, dict_variant);
|
||||||
|
while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
|
||||||
|
{
|
||||||
|
if (!g_str_has_prefix (key, dev_prefix))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
g_ptr_array_add (print_keys, g_strdup (key));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!print_keys->len)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
updated_dict = load_data ();
|
||||||
|
|
||||||
|
for (guint i = 0; i < print_keys->len; ++i)
|
||||||
|
{
|
||||||
|
key = g_ptr_array_index (print_keys, i);
|
||||||
|
if (!g_variant_dict_remove (updated_dict, key))
|
||||||
|
{
|
||||||
|
g_warning ("Print '%s' key not found!", key);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("Dropping print '%s' from gallery", key);
|
||||||
|
}
|
||||||
|
|
||||||
|
save_data (g_variant_dict_end (updated_dict));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
FpPrint *
|
FpPrint *
|
||||||
print_create_template (FpDevice *dev, FpFinger finger, gboolean load_existing)
|
print_create_template (FpDevice *dev, FpFinger finger, gboolean load_existing)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,12 +20,17 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <libfprint/fprint.h>
|
||||||
|
|
||||||
int print_data_save (FpPrint *print,
|
int print_data_save (FpPrint *print,
|
||||||
FpFinger finger,
|
FpFinger finger,
|
||||||
gboolean update_fingerprint);
|
gboolean update_fingerprint);
|
||||||
FpPrint * print_data_load (FpDevice *dev,
|
FpPrint * print_data_load (FpDevice *dev,
|
||||||
FpFinger finger);
|
FpFinger finger);
|
||||||
GPtrArray * gallery_data_load (FpDevice *dev);
|
GPtrArray * gallery_data_load (FpDevice *dev);
|
||||||
|
gboolean clear_saved_prints (FpDevice *dev,
|
||||||
|
GError **error);
|
||||||
FpPrint * print_create_template (FpDevice *dev,
|
FpPrint * print_create_template (FpDevice *dev,
|
||||||
FpFinger finger,
|
FpFinger finger,
|
||||||
const gboolean load_existing);
|
const gboolean load_existing);
|
||||||
|
|||||||
@@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* Shared library loader for libfprint
|
|
||||||
* Copyright (C) 2021 Marco Trevisan <marco.trevisan@canonical.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <libfprint/fprint.h>
|
|
||||||
|
|
||||||
#include "libfprint/tod/tod-shared-loader.h"
|
|
||||||
#include "libfprint/fpi-device.h"
|
|
||||||
|
|
||||||
static char *
|
|
||||||
id_table_to_string (FpDeviceType device_type,
|
|
||||||
const FpIdEntry *id_table)
|
|
||||||
{
|
|
||||||
const FpIdEntry *entry;
|
|
||||||
char *str = NULL;
|
|
||||||
|
|
||||||
if (!id_table)
|
|
||||||
return g_strdup ("INVALID: Empty ID table");
|
|
||||||
|
|
||||||
entry = id_table;
|
|
||||||
while (TRUE)
|
|
||||||
{
|
|
||||||
g_autofree char *value = NULL;
|
|
||||||
|
|
||||||
if (device_type == FP_DEVICE_TYPE_VIRTUAL)
|
|
||||||
{
|
|
||||||
if (entry->virtual_envvar)
|
|
||||||
value = g_strdup (entry->virtual_envvar);
|
|
||||||
}
|
|
||||||
else if (device_type == FP_DEVICE_TYPE_USB)
|
|
||||||
{
|
|
||||||
if (entry->vid)
|
|
||||||
value = g_strdup_printf ("%04x:%04x", entry->vid, entry->pid);
|
|
||||||
}
|
|
||||||
else if (device_type == FP_DEVICE_TYPE_UDEV)
|
|
||||||
{
|
|
||||||
if (entry->hid_id.vid)
|
|
||||||
{
|
|
||||||
g_autofree gchar *udev_flags = NULL;
|
|
||||||
|
|
||||||
udev_flags = g_flags_to_string (fpi_device_udev_subtype_flags_get_type (),
|
|
||||||
entry->udev_types);
|
|
||||||
value = g_strdup_printf ("%s (%04x:%04x) [%s]",
|
|
||||||
entry->spi_acpi_id,
|
|
||||||
entry->hid_id.vid, entry->hid_id.pid,
|
|
||||||
udev_flags);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value = g_strdup (entry->spi_acpi_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return g_strdup ("Unsupported device type");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!value)
|
|
||||||
return str;
|
|
||||||
|
|
||||||
if (!str)
|
|
||||||
{
|
|
||||||
str = g_steal_pointer (&value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_autofree char *tmp = g_steal_pointer (&str);
|
|
||||||
str = g_strconcat (tmp, ", ", value, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
entry++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
device_type_to_string (FpDeviceType device_type)
|
|
||||||
{
|
|
||||||
g_autoptr(GEnumClass) device_types = g_type_class_ref (fp_device_type_get_type ());
|
|
||||||
GEnumValue *value = g_enum_get_value (device_types, device_type);
|
|
||||||
|
|
||||||
return value->value_nick;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
|
||||||
scan_type_to_string (FpScanType scan_type)
|
|
||||||
{
|
|
||||||
g_autoptr(GEnumClass) scan_types = g_type_class_ref (fp_scan_type_get_type ());
|
|
||||||
GEnumValue *value = g_enum_get_value (scan_types, scan_type);
|
|
||||||
|
|
||||||
return value->value_nick;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
g_autoptr(GArray) shared_drivers = NULL;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
tod_shared_drivers_register ();
|
|
||||||
|
|
||||||
shared_drivers = tod_shared_drivers_get ();
|
|
||||||
g_print ("Found %u drivers\n", shared_drivers->len);
|
|
||||||
|
|
||||||
for (i = 0; i < shared_drivers->len; i++)
|
|
||||||
{
|
|
||||||
GType driver = g_array_index (shared_drivers, GType, i);
|
|
||||||
g_autoptr(FpDeviceClass) cls = g_type_class_ref (driver);
|
|
||||||
g_autofree char *id_table = NULL;
|
|
||||||
g_autofree char *features = NULL;
|
|
||||||
|
|
||||||
id_table = id_table_to_string (cls->type, cls->id_table);
|
|
||||||
features = g_flags_to_string (fp_device_feature_get_type (), cls->features);
|
|
||||||
|
|
||||||
g_print ("ID: %s\n", cls->id);
|
|
||||||
g_print ("Full Name: %s\n", cls->full_name);
|
|
||||||
g_print ("Type: %s\n", device_type_to_string (cls->type));
|
|
||||||
g_print ("Enroll stages: %d\n", cls->nr_enroll_stages);
|
|
||||||
g_print ("Scan type: %s\n", scan_type_to_string (cls->scan_type));
|
|
||||||
g_print ("Seconds to get Hot: %d\n", cls->temp_hot_seconds);
|
|
||||||
g_print ("Seconds to get Cold: %d\n", cls->temp_cold_seconds);
|
|
||||||
g_print ("Supported Devices: %s\n", id_table);
|
|
||||||
g_print ("Supported features: %s\n", features);
|
|
||||||
g_print ("Implemented VFuncs:\n");
|
|
||||||
g_print (" usb_discover: %s\n", cls->usb_discover ? "true" : "false");
|
|
||||||
g_print (" probe: %s\n", cls->probe ? "true" : "false");
|
|
||||||
g_print (" open: %s\n", cls->open ? "true" : "false");
|
|
||||||
g_print (" close: %s\n", cls->close ? "true" : "false");
|
|
||||||
g_print (" suspend: %s\n", cls->suspend ? "true" : "false");
|
|
||||||
g_print (" resume: %s\n", cls->resume ? "true" : "false");
|
|
||||||
g_print (" enroll: %s\n", cls->enroll ? "true" : "false");
|
|
||||||
g_print (" verify: %s\n", cls->verify ? "true" : "false");
|
|
||||||
g_print (" identify: %s\n", cls->identify ? "true" : "false");
|
|
||||||
g_print (" capture: %s\n", cls->capture ? "true" : "false");
|
|
||||||
g_print (" list: %s\n", cls->list ? "true" : "false");
|
|
||||||
g_print (" delete: %s\n", cls->delete ? "true" : "false");
|
|
||||||
g_print (" clear_storage: %s\n", cls->clear_storage ? "true" : "false");
|
|
||||||
g_print (" cancel: %s\n", cls->cancel ? "true" : "false");
|
|
||||||
|
|
||||||
if (i < shared_drivers->len - 1)
|
|
||||||
g_print ("------------\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
tod_shared_drivers_unregister ();
|
|
||||||
}
|
|
||||||
+801
-427
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* Driver for Egis Technology (LighTuning) Match-On-Chip sensors
|
* Driver for Egis Technology (LighTuning) Match-On-Chip sensors
|
||||||
* Originally authored 2023 by Joshua Grisham <josh@joshuagrisham.com>
|
* Copyright (C) 2023-2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
*
|
*
|
||||||
* Portions of code and logic inspired from the elanmoc libfprint driver
|
* Portions of code and logic inspired from the elanmoc libfprint driver
|
||||||
* which is copyright (C) 2021 Elan Microelectronics Inc (see elanmoc.c)
|
* which is copyright (C) 2021 Elan Microelectronics Inc (see elanmoc.c)
|
||||||
*
|
*
|
||||||
* Based on original reverse-engineering work by Joshua Grisham. The protocol has
|
|
||||||
* been reverse-engineered from captures of the official Windows driver, and by
|
|
||||||
* testing commands on the sensor with a multiplatform Python prototype driver:
|
|
||||||
* https://github.com/joshuagrisham/galaxy-book2-pro-linux/tree/main/fingerprint/
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
@@ -27,15 +22,18 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "fpi-device.h"
|
|
||||||
#include "fpi-ssm.h"
|
#include "fpi-ssm.h"
|
||||||
|
|
||||||
G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC, FpDevice)
|
#include "fpi-sdcp-device.h"
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC, FpSdcpDevice)
|
||||||
|
|
||||||
#define EGISMOC_DRIVER_FULLNAME "Egis Technology (LighTuning) Match-on-Chip"
|
#define EGISMOC_DRIVER_FULLNAME "Egis Technology (LighTuning) Match-on-Chip"
|
||||||
|
|
||||||
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0)
|
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE1 (1 << 0)
|
||||||
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 (1 << 1)
|
#define EGISMOC_DRIVER_CHECK_PREFIX_TYPE2 (1 << 1)
|
||||||
|
#define EGISMOC_DRIVER_MAX_ENROLL_STAGES_20 (1 << 2)
|
||||||
|
#define EGISMOC_DRIVER_MAX_ENROLL_STAGES_15 (1 << 3)
|
||||||
|
|
||||||
#define EGISMOC_EP_CMD_OUT (0x02 | FPI_USB_ENDPOINT_OUT)
|
#define EGISMOC_EP_CMD_OUT (0x02 | FPI_USB_ENDPOINT_OUT)
|
||||||
#define EGISMOC_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN)
|
#define EGISMOC_EP_CMD_IN (0x81 | FPI_USB_ENDPOINT_IN)
|
||||||
@@ -49,9 +47,13 @@ G_DECLARE_FINAL_TYPE (FpiDeviceEgisMoc, fpi_device_egismoc, FPI, DEVICE_EGISMOC,
|
|||||||
#define EGISMOC_USB_IN_RECV_LENGTH 4096
|
#define EGISMOC_USB_IN_RECV_LENGTH 4096
|
||||||
#define EGISMOC_USB_INTERRUPT_IN_RECV_LENGTH 64
|
#define EGISMOC_USB_INTERRUPT_IN_RECV_LENGTH 64
|
||||||
|
|
||||||
#define EGISMOC_ENROLL_TIMES 10
|
#define EGISMOC_MAX_ENROLL_STAGES_DEFAULT 10
|
||||||
#define EGISMOC_MAX_ENROLL_NUM 10
|
#define EGISMOC_MAX_ENROLL_NUM 10
|
||||||
#define EGISMOC_FINGERPRINT_DATA_SIZE 32
|
#define EGISMOC_FINGER_ON_SENSOR_TIMEOUT_USEC (10 * G_USEC_PER_SEC)
|
||||||
|
|
||||||
|
#define EGISMOC_CONNECT_RESPONSE_PREFIX_SIZE 15
|
||||||
|
#define EGISMOC_IDENTIFY_RESPONSE_PREFIX_SIZE 14
|
||||||
|
#define EGISMOC_ENROLL_STARTING_RESPONSE_PREFIX_SIZE 14
|
||||||
#define EGISMOC_LIST_RESPONSE_PREFIX_SIZE 14
|
#define EGISMOC_LIST_RESPONSE_PREFIX_SIZE 14
|
||||||
#define EGISMOC_LIST_RESPONSE_SUFFIX_SIZE 2
|
#define EGISMOC_LIST_RESPONSE_SUFFIX_SIZE 2
|
||||||
|
|
||||||
@@ -71,6 +73,9 @@ static gsize cmd_fw_version_len = sizeof (cmd_fw_version) / sizeof (cmd_fw_versi
|
|||||||
static guchar rsp_fw_version_suffix[] = {0x90, 0x00};
|
static guchar rsp_fw_version_suffix[] = {0x90, 0x00};
|
||||||
static gsize rsp_fw_version_suffix_len = sizeof (rsp_fw_version_suffix) / sizeof (rsp_fw_version_suffix[0]);
|
static gsize rsp_fw_version_suffix_len = sizeof (rsp_fw_version_suffix) / sizeof (rsp_fw_version_suffix[0]);
|
||||||
|
|
||||||
|
static guchar rsp_sensor_has_finger_suffix[] = {0x90, 0x00, 0x90, 0x00};
|
||||||
|
static gsize rsp_sensor_has_finger_suffix_len = sizeof (rsp_sensor_has_finger_suffix) / sizeof (rsp_sensor_has_finger_suffix[0]);
|
||||||
|
|
||||||
static guchar cmd_list[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x19, 0x04, 0x00, 0x00, 0x01, 0x40};
|
static guchar cmd_list[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x19, 0x04, 0x00, 0x00, 0x01, 0x40};
|
||||||
static gsize cmd_list_len = sizeof (cmd_list) / sizeof (cmd_list[0]);
|
static gsize cmd_list_len = sizeof (cmd_list) / sizeof (cmd_list[0]);
|
||||||
|
|
||||||
@@ -92,25 +97,28 @@ static gsize cmd_sensor_enroll_len = sizeof (cmd_sensor_enroll) / sizeof (cmd_se
|
|||||||
|
|
||||||
static guchar cmd_enroll_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x01, 0x00, 0x00, 0x00, 0x20};
|
static guchar cmd_enroll_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x01, 0x00, 0x00, 0x00, 0x20};
|
||||||
static gsize cmd_enroll_starting_len = sizeof (cmd_enroll_starting) / sizeof (cmd_enroll_starting[0]);
|
static gsize cmd_enroll_starting_len = sizeof (cmd_enroll_starting) / sizeof (cmd_enroll_starting[0]);
|
||||||
|
static guchar rsp_enroll_starting_suffix[] = {0x90, 0x00};
|
||||||
|
static gsize rsp_enroll_starting_suffix_len = sizeof (rsp_enroll_starting_suffix) / sizeof (rsp_enroll_starting_suffix[0]);
|
||||||
|
|
||||||
static guchar cmd_sensor_start_capture[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x02, 0x01};
|
static guchar cmd_sensor_start_capture[] = {0x00, 0x00, 0x00, 0x04, 0x50, 0x16, 0x02, 0x01};
|
||||||
static gsize cmd_sensor_start_capture_len = sizeof (cmd_sensor_start_capture) / sizeof (cmd_sensor_start_capture[0]);
|
static gsize cmd_sensor_start_capture_len = sizeof (cmd_sensor_start_capture) / sizeof (cmd_sensor_start_capture[0]);
|
||||||
|
|
||||||
|
static guchar cmd_capture_post_wait_finger[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x80};
|
||||||
|
static gsize cmd_capture_post_wait_finger_len = sizeof (cmd_capture_post_wait_finger) / sizeof (cmd_capture_post_wait_finger[0]);
|
||||||
|
|
||||||
static guchar cmd_read_capture[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x02, 0x02, 0x00, 0x00, 0x02};
|
static guchar cmd_read_capture[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x02, 0x02, 0x00, 0x00, 0x02};
|
||||||
static gsize cmd_read_capture_len = sizeof (cmd_read_capture) / sizeof (cmd_read_capture[0]);
|
static gsize cmd_read_capture_len = sizeof (cmd_read_capture) / sizeof (cmd_read_capture[0]);
|
||||||
static guchar rsp_read_success_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
static guchar rsp_read_success_suffix[] = {0x90, 0x00};
|
||||||
static gsize rsp_read_success_prefix_len = sizeof (rsp_read_success_prefix) / sizeof (rsp_read_success_prefix[0]);
|
|
||||||
static guchar rsp_read_success_suffix[] = {0x0a, 0x90, 0x00};
|
|
||||||
static gsize rsp_read_success_suffix_len = sizeof (rsp_read_success_suffix) / sizeof (rsp_read_success_suffix[0]);
|
static gsize rsp_read_success_suffix_len = sizeof (rsp_read_success_suffix) / sizeof (rsp_read_success_suffix[0]);
|
||||||
static guchar rsp_read_offcenter_prefix[] = {0x00, 0x00, 0x00, 0x04};
|
static guchar rsp_read_offcenter_suffix[] = {0x64, 0x91};
|
||||||
static gsize rsp_read_offcenter_prefix_len = sizeof (rsp_read_offcenter_prefix) / sizeof (rsp_read_offcenter_prefix[0]);
|
|
||||||
static guchar rsp_read_offcenter_suffix[] = {0x0a, 0x64, 0x91};
|
|
||||||
static gsize rsp_read_offcenter_suffix_len = sizeof (rsp_read_offcenter_suffix) / sizeof (rsp_read_offcenter_suffix[0]);
|
static gsize rsp_read_offcenter_suffix_len = sizeof (rsp_read_offcenter_suffix) / sizeof (rsp_read_offcenter_suffix[0]);
|
||||||
static guchar rsp_read_dirty_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x64};
|
static guchar rsp_read_dirty_prefix[] = {0x00, 0x00, 0x00, 0x02, 0x64};
|
||||||
static gsize rsp_read_dirty_prefix_len = sizeof (rsp_read_dirty_prefix) / sizeof (rsp_read_dirty_prefix[0]);
|
static gsize rsp_read_dirty_prefix_len = sizeof (rsp_read_dirty_prefix) / sizeof (rsp_read_dirty_prefix[0]);
|
||||||
|
|
||||||
static guchar cmd_commit_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x05, 0x00, 0x00, 0x00, 0x20};
|
static guchar cmd_commit_starting[] = {0x00, 0x00, 0x00, 0x07, 0x50, 0x16, 0x05, 0x00, 0x00, 0x00, 0x20};
|
||||||
static gsize cmd_commit_starting_len = sizeof (cmd_commit_starting) / sizeof (cmd_commit_starting[0]);
|
static gsize cmd_commit_starting_len = sizeof (cmd_commit_starting) / sizeof (cmd_commit_starting[0]);
|
||||||
|
static guchar rsp_commit_success_suffix[] = {0x90, 0x00};
|
||||||
|
static gsize rsp_commit_success_suffix_len = sizeof (rsp_commit_success_suffix) / sizeof (rsp_commit_success_suffix[0]);
|
||||||
|
|
||||||
|
|
||||||
/* commands which exist on the device but are currently not used */
|
/* commands which exist on the device but are currently not used */
|
||||||
@@ -129,8 +137,13 @@ static gsize cmd_commit_starting_len = sizeof (cmd_commit_starting) / sizeof (cm
|
|||||||
/* prefixes/suffixes and other things for dynamically created command payloads */
|
/* prefixes/suffixes and other things for dynamically created command payloads */
|
||||||
|
|
||||||
#define EGISMOC_CHECK_BYTES_LENGTH 2
|
#define EGISMOC_CHECK_BYTES_LENGTH 2
|
||||||
#define EGISMOC_IDENTIFY_RESPONSE_PRINT_ID_OFFSET 46
|
|
||||||
#define EGISMOC_CMD_CHECK_SEPARATOR_LENGTH 32
|
static guchar cmd_sdcp_connect_prefix[] = {0x00, 0x00, 0x00, 0x6b, 0x50, 0x57, 0x01, 0x00, 0x00, 0x00, 0x62, 0x20};
|
||||||
|
static gsize cmd_sdcp_connect_prefix_len = sizeof (cmd_sdcp_connect_prefix) / sizeof (cmd_sdcp_connect_prefix[0]);
|
||||||
|
static guchar cmd_sdcp_connect_suffix[] = {0x00, 0x00};
|
||||||
|
static gsize cmd_sdcp_connect_suffix_len = sizeof (cmd_sdcp_connect_suffix) / sizeof (cmd_sdcp_connect_suffix[0]);
|
||||||
|
static guchar rsp_sdcp_connect_success_suffix[] = {0x90, 0x00};
|
||||||
|
static gsize rsp_sdcp_connect_success_suffix_len = sizeof (rsp_sdcp_connect_success_suffix) / sizeof (rsp_sdcp_connect_success_suffix[0]);
|
||||||
|
|
||||||
static guchar cmd_new_print_prefix[] = {0x00, 0x00, 0x00, 0x27, 0x50, 0x16, 0x03, 0x00, 0x00, 0x00, 0x20};
|
static guchar cmd_new_print_prefix[] = {0x00, 0x00, 0x00, 0x27, 0x50, 0x16, 0x03, 0x00, 0x00, 0x00, 0x20};
|
||||||
static gsize cmd_new_print_prefix_len = sizeof (cmd_new_print_prefix) / sizeof (cmd_new_print_prefix[0]);
|
static gsize cmd_new_print_prefix_len = sizeof (cmd_new_print_prefix) / sizeof (cmd_new_print_prefix[0]);
|
||||||
@@ -168,6 +181,18 @@ typedef enum {
|
|||||||
DEV_INIT_STATES,
|
DEV_INIT_STATES,
|
||||||
} DeviceInitStates;
|
} DeviceInitStates;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CONNECT,
|
||||||
|
CONNECT_RESPONSE,
|
||||||
|
CONNECT_STATES,
|
||||||
|
} ConnectStates;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WAIT_FINGER_NOT_ON_SENSOR,
|
||||||
|
WAIT_FINGER_ON_SENSOR,
|
||||||
|
WAIT_FINGER_STATES,
|
||||||
|
} WaitFingerStates;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
IDENTIFY_GET_ENROLLED_IDS,
|
IDENTIFY_GET_ENROLLED_IDS,
|
||||||
IDENTIFY_CHECK_ENROLLED_NUM,
|
IDENTIFY_CHECK_ENROLLED_NUM,
|
||||||
@@ -176,8 +201,6 @@ typedef enum {
|
|||||||
IDENTIFY_WAIT_FINGER,
|
IDENTIFY_WAIT_FINGER,
|
||||||
IDENTIFY_SENSOR_CHECK,
|
IDENTIFY_SENSOR_CHECK,
|
||||||
IDENTIFY_CHECK,
|
IDENTIFY_CHECK,
|
||||||
IDENTIFY_COMPLETE_SENSOR_RESET,
|
|
||||||
IDENTIFY_COMPLETE,
|
|
||||||
IDENTIFY_STATES,
|
IDENTIFY_STATES,
|
||||||
} IdentifyStates;
|
} IdentifyStates;
|
||||||
|
|
||||||
@@ -193,11 +216,10 @@ typedef enum {
|
|||||||
ENROLL_CAPTURE_SENSOR_RESET,
|
ENROLL_CAPTURE_SENSOR_RESET,
|
||||||
ENROLL_CAPTURE_SENSOR_START_CAPTURE,
|
ENROLL_CAPTURE_SENSOR_START_CAPTURE,
|
||||||
ENROLL_CAPTURE_WAIT_FINGER,
|
ENROLL_CAPTURE_WAIT_FINGER,
|
||||||
|
ENROLL_CAPTURE_POST_WAIT_FINGER,
|
||||||
ENROLL_CAPTURE_READ_RESPONSE,
|
ENROLL_CAPTURE_READ_RESPONSE,
|
||||||
ENROLL_COMMIT_START,
|
ENROLL_COMMIT_START,
|
||||||
ENROLL_COMMIT,
|
ENROLL_COMMIT,
|
||||||
ENROLL_COMMIT_SENSOR_RESET,
|
|
||||||
ENROLL_COMPLETE,
|
|
||||||
ENROLL_STATES,
|
ENROLL_STATES,
|
||||||
} EnrollStates;
|
} EnrollStates;
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,14 @@ static const FpIdEntry id_table[] = {
|
|||||||
{ .vid = 0x04f3, .pid = 0x0c88, },
|
{ .vid = 0x04f3, .pid = 0x0c88, },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c8c, },
|
{ .vid = 0x04f3, .pid = 0x0c8c, },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
{ .vid = 0x04f3, .pid = 0x0c8d, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0c98, },
|
||||||
{ .vid = 0x04f3, .pid = 0x0c99, },
|
{ .vid = 0x04f3, .pid = 0x0c99, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0c9d, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0c9f, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0ca3, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0ca7, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0ca8, },
|
||||||
|
{ .vid = 0x04f3, .pid = 0x0cb0, },
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -128,10 +135,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_CMD_SEND = 0,
|
ELAN_MOC_CMD_SEND = 0,
|
||||||
FP_CMD_GET,
|
ELAN_MOC_CMD_GET,
|
||||||
FP_CMD_NUM_STATES,
|
ELAN_MOC_CMD_NUM_STATES,
|
||||||
} FpCmdState;
|
} ElanMocCmdState;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_cmd_run_state (FpiSsm *ssm,
|
fp_cmd_run_state (FpiSsm *ssm,
|
||||||
@@ -142,7 +149,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_CMD_SEND:
|
case ELAN_MOC_CMD_SEND:
|
||||||
if (self->cmd_transfer)
|
if (self->cmd_transfer)
|
||||||
{
|
{
|
||||||
self->cmd_transfer->ssm = ssm;
|
self->cmd_transfer->ssm = ssm;
|
||||||
@@ -158,7 +165,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_GET:
|
case ELAN_MOC_CMD_GET:
|
||||||
if (self->cmd_len_in == 0)
|
if (self->cmd_len_in == 0)
|
||||||
{
|
{
|
||||||
CommandData *data = fpi_ssm_get_data (ssm);
|
CommandData *data = fpi_ssm_get_data (ssm);
|
||||||
@@ -225,7 +232,7 @@ elanmoc_get_cmd (FpDevice *device, guint8 *buffer_out,
|
|||||||
|
|
||||||
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
||||||
fp_cmd_run_state,
|
fp_cmd_run_state,
|
||||||
FP_CMD_NUM_STATES);
|
ELAN_MOC_CMD_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
||||||
|
|
||||||
|
|||||||
@@ -340,9 +340,11 @@ static const struct elanspi_regtable elanspi_calibration_table_new_page1 = {
|
|||||||
|
|
||||||
// using checkargs ACPI:HIDPID
|
// using checkargs ACPI:HIDPID
|
||||||
static const FpIdEntry elanspi_id_table[] = {
|
static const FpIdEntry elanspi_id_table[] = {
|
||||||
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x2766}, .driver_data = ELANSPI_NO_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3057}, .driver_data = ELANSPI_180_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3057}, .driver_data = ELANSPI_180_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3087}, .driver_data = ELANSPI_180_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3087}, .driver_data = ELANSPI_180_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30c6}, .driver_data = ELANSPI_180_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30c6}, .driver_data = ELANSPI_180_ROTATE},
|
||||||
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3128}, .driver_data = ELANSPI_90LEFT_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3134}, .driver_data = ELANSPI_90LEFT_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN70A1", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3134}, .driver_data = ELANSPI_90LEFT_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3148}, .driver_data = ELANSPI_180_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x3148}, .driver_data = ELANSPI_180_ROTATE},
|
||||||
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
{.udev_types = ELANSPI_UDEV_TYPES, .spi_acpi_id = "ELAN7001", .hid_id = {.vid = ELANSPI_TP_VID, .pid = 0x30b2}, .driver_data = ELANSPI_NO_ROTATE},
|
||||||
|
|||||||
@@ -29,7 +29,14 @@ G_DEFINE_TYPE (FpiDeviceFocaltechMoc, fpi_device_focaltech_moc, FP_TYPE_DEVICE)
|
|||||||
static const FpIdEntry id_table[] = {
|
static const FpIdEntry id_table[] = {
|
||||||
{ .vid = 0x2808, .pid = 0x9e48, },
|
{ .vid = 0x2808, .pid = 0x9e48, },
|
||||||
{ .vid = 0x2808, .pid = 0xd979, },
|
{ .vid = 0x2808, .pid = 0xd979, },
|
||||||
|
{ .vid = 0x2808, .pid = 0xa27a, },
|
||||||
{ .vid = 0x2808, .pid = 0xa959, },
|
{ .vid = 0x2808, .pid = 0xa959, },
|
||||||
|
{ .vid = 0x2808, .pid = 0xa99a, },
|
||||||
|
{ .vid = 0x2808, .pid = 0xa57a, },
|
||||||
|
{ .vid = 0x2808, .pid = 0xa78a, },
|
||||||
|
{ .vid = 0x2808, .pid = 0x1579, },
|
||||||
|
{ .vid = 0x2808, .pid = 0x077A, },
|
||||||
|
{ .vid = 0x2808, .pid = 0x079A, },
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -232,10 +239,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_CMD_SEND = 0,
|
FOCALTECH_CMD_SEND = 0,
|
||||||
FP_CMD_GET,
|
FOCALTECH_CMD_GET,
|
||||||
FP_CMD_NUM_STATES,
|
FOCALTECH_CMD_NUM_STATES,
|
||||||
} FpCmdState;
|
} FocaltechCmdState;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_cmd_run_state (FpiSsm *ssm,
|
fp_cmd_run_state (FpiSsm *ssm,
|
||||||
@@ -246,7 +253,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_CMD_SEND:
|
case FOCALTECH_CMD_SEND:
|
||||||
if (self->cmd_transfer)
|
if (self->cmd_transfer)
|
||||||
{
|
{
|
||||||
self->cmd_transfer->ssm = ssm;
|
self->cmd_transfer->ssm = ssm;
|
||||||
@@ -263,7 +270,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_GET:
|
case FOCALTECH_CMD_GET:
|
||||||
if (self->cmd_len_in == 0)
|
if (self->cmd_len_in == 0)
|
||||||
{
|
{
|
||||||
CommandData *data = fpi_ssm_get_data (ssm);
|
CommandData *data = fpi_ssm_get_data (ssm);
|
||||||
@@ -331,7 +338,7 @@ focaltech_moc_get_cmd (FpDevice *device, guint8 *buffer_out,
|
|||||||
|
|
||||||
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
||||||
fp_cmd_run_state,
|
fp_cmd_run_state,
|
||||||
FP_CMD_NUM_STATES);
|
FOCALTECH_CMD_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#define FP_COMPONENT "fpcmoc"
|
#define FP_COMPONENT "fpcmoc"
|
||||||
#define MAX_ENROLL_SAMPLES (25)
|
#define MAX_ENROLL_SAMPLES (25)
|
||||||
#define CTRL_TIMEOUT (1000)
|
#define CTRL_TIMEOUT (2000)
|
||||||
#define DATA_TIMEOUT (5000)
|
#define DATA_TIMEOUT (5000)
|
||||||
|
|
||||||
/* Usb port setting */
|
/* Usb port setting */
|
||||||
@@ -65,9 +65,13 @@ typedef struct
|
|||||||
static const FpIdEntry id_table[] = {
|
static const FpIdEntry id_table[] = {
|
||||||
{ .vid = 0x10A5, .pid = 0xFFE0, },
|
{ .vid = 0x10A5, .pid = 0xFFE0, },
|
||||||
{ .vid = 0x10A5, .pid = 0xA305, },
|
{ .vid = 0x10A5, .pid = 0xA305, },
|
||||||
|
{ .vid = 0x10A5, .pid = 0xA306, },
|
||||||
{ .vid = 0x10A5, .pid = 0xDA04, },
|
{ .vid = 0x10A5, .pid = 0xDA04, },
|
||||||
{ .vid = 0x10A5, .pid = 0xD805, },
|
{ .vid = 0x10A5, .pid = 0xD805, },
|
||||||
{ .vid = 0x10A5, .pid = 0xD205, },
|
{ .vid = 0x10A5, .pid = 0xD205, },
|
||||||
|
{ .vid = 0x10A5, .pid = 0x9524, },
|
||||||
|
{ .vid = 0x10A5, .pid = 0x9544, },
|
||||||
|
{ .vid = 0x10A5, .pid = 0xC844, },
|
||||||
/* terminating entry */
|
/* terminating entry */
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 },
|
{ .vid = 0, .pid = 0, .driver_data = 0 },
|
||||||
};
|
};
|
||||||
@@ -82,7 +86,7 @@ fpc_suspend_resume_cb (FpiUsbTransfer *transfer,
|
|||||||
|
|
||||||
fp_dbg ("%s current ssm state: %d", G_STRFUNC, ssm_state);
|
fp_dbg ("%s current ssm state: %d", G_STRFUNC, ssm_state);
|
||||||
|
|
||||||
if (ssm_state == FP_CMD_SUSPENDED)
|
if (ssm_state == FPC_CMD_SUSPENDED)
|
||||||
{
|
{
|
||||||
if (error)
|
if (error)
|
||||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
@@ -90,12 +94,12 @@ fpc_suspend_resume_cb (FpiUsbTransfer *transfer,
|
|||||||
fpi_device_suspend_complete (device, error);
|
fpi_device_suspend_complete (device, error);
|
||||||
/* The resume handler continues to the next state! */
|
/* The resume handler continues to the next state! */
|
||||||
}
|
}
|
||||||
else if (ssm_state == FP_CMD_RESUME)
|
else if (ssm_state == FPC_CMD_RESUME)
|
||||||
{
|
{
|
||||||
if (error)
|
if (error)
|
||||||
fpi_ssm_mark_failed (transfer->ssm, error);
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
else
|
else
|
||||||
fpi_ssm_jump_to_state (transfer->ssm, FP_CMD_GET_DATA);
|
fpi_ssm_jump_to_state (transfer->ssm, FPC_CMD_GET_DATA);
|
||||||
|
|
||||||
fpi_device_resume_complete (device, error);
|
fpi_device_resume_complete (device, error);
|
||||||
}
|
}
|
||||||
@@ -114,7 +118,7 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && (self->cmd_suspended))
|
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && (self->cmd_suspended))
|
||||||
{
|
{
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
fpi_ssm_jump_to_state (transfer->ssm, FP_CMD_SUSPENDED);
|
fpi_ssm_jump_to_state (transfer->ssm, FPC_CMD_SUSPENDED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +139,7 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
fp_dbg ("%s current ssm request: %d state: %d", G_STRFUNC, data->request, ssm_state);
|
fp_dbg ("%s current ssm request: %d state: %d", G_STRFUNC, data->request, ssm_state);
|
||||||
|
|
||||||
/* clean cmd_ssm except capture command for suspend/resume case */
|
/* clean cmd_ssm except capture command for suspend/resume case */
|
||||||
if (ssm_state != FP_CMD_SEND || data->request != FPC_CMD_ARM)
|
if (ssm_state != FPC_CMD_SEND || data->request != FPC_CMD_ARM)
|
||||||
self->cmd_ssm = NULL;
|
self->cmd_ssm = NULL;
|
||||||
|
|
||||||
if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE)
|
if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE)
|
||||||
@@ -149,13 +153,13 @@ fpc_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
}
|
}
|
||||||
else if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE_EVTDATA)
|
else if (data->cmdtype == FPC_CMDTYPE_TO_DEVICE_EVTDATA)
|
||||||
{
|
{
|
||||||
if (ssm_state == FP_CMD_SEND)
|
if (ssm_state == FPC_CMD_SEND)
|
||||||
{
|
{
|
||||||
fpi_ssm_next_state (transfer->ssm);
|
fpi_ssm_next_state (transfer->ssm);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ssm_state == FP_CMD_GET_DATA)
|
if (ssm_state == FPC_CMD_GET_DATA)
|
||||||
{
|
{
|
||||||
fpc_cmd_response_t evt_data = {0};
|
fpc_cmd_response_t evt_data = {0};
|
||||||
fp_dbg ("%s recv evt data length: %ld", G_STRFUNC, transfer->actual_length);
|
fp_dbg ("%s recv evt data length: %ld", G_STRFUNC, transfer->actual_length);
|
||||||
@@ -269,6 +273,7 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||||||
FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev);
|
FpiDeviceFpcMoc *self = FPI_DEVICE_FPCMOC (dev);
|
||||||
CommandData *data = fpi_ssm_get_data (ssm);
|
CommandData *data = fpi_ssm_get_data (ssm);
|
||||||
|
|
||||||
|
self->cmd_ssm = NULL;
|
||||||
/* Notify about the SSM failure from here instead. */
|
/* Notify about the SSM failure from here instead. */
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
@@ -276,8 +281,6 @@ fpc_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||||||
if (data->callback)
|
if (data->callback)
|
||||||
data->callback (self, NULL, error);
|
data->callback (self, NULL, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
self->cmd_ssm = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -289,11 +292,11 @@ fpc_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_CMD_SEND:
|
case FPC_CMD_SEND:
|
||||||
fpc_send_ctrl_cmd (dev);
|
fpc_send_ctrl_cmd (dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_GET_DATA:
|
case FPC_CMD_GET_DATA:
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
||||||
@@ -304,7 +307,7 @@ fpc_cmd_run_state (FpiSsm *ssm,
|
|||||||
fpi_ssm_get_data (ssm));
|
fpi_ssm_get_data (ssm));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_SUSPENDED:
|
case FPC_CMD_SUSPENDED:
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_fill_control (transfer,
|
fpi_usb_transfer_fill_control (transfer,
|
||||||
@@ -320,7 +323,7 @@ fpc_cmd_run_state (FpiSsm *ssm,
|
|||||||
fpc_suspend_resume_cb, NULL);
|
fpc_suspend_resume_cb, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_RESUME:
|
case FPC_CMD_RESUME:
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_fill_control (transfer,
|
fpi_usb_transfer_fill_control (transfer,
|
||||||
@@ -351,21 +354,22 @@ fpc_sensor_cmd (FpiDeviceFpcMoc *self,
|
|||||||
|
|
||||||
data = g_memdup2 (cmd_data, sizeof (CommandData));
|
data = g_memdup2 (cmd_data, sizeof (CommandData));
|
||||||
|
|
||||||
|
g_clear_object (&self->interrupt_cancellable);
|
||||||
|
|
||||||
if (wait_data_delay)
|
if (wait_data_delay)
|
||||||
{
|
{
|
||||||
self->cmd_data_timeout = 0;
|
self->cmd_data_timeout = 0;
|
||||||
g_set_object (&self->interrupt_cancellable, g_cancellable_new ());
|
self->interrupt_cancellable = g_cancellable_new ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self->cmd_data_timeout = DATA_TIMEOUT;
|
self->cmd_data_timeout = DATA_TIMEOUT;
|
||||||
g_clear_object (&self->interrupt_cancellable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert (self->cmd_ssm == NULL);
|
g_assert (self->cmd_ssm == NULL);
|
||||||
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
||||||
fpc_cmd_run_state,
|
fpc_cmd_run_state,
|
||||||
FP_CMD_NUM_STATES);
|
FPC_CMD_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_set_data (self->cmd_ssm, data, g_free);
|
fpi_ssm_set_data (self->cmd_ssm, data, g_free);
|
||||||
fpi_ssm_start (self->cmd_ssm, fpc_cmd_ssm_done);
|
fpi_ssm_start (self->cmd_ssm, fpc_cmd_ssm_done);
|
||||||
@@ -388,7 +392,7 @@ fpc_dev_release_interface (FpiDeviceFpcMoc *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Notify close complete */
|
/* Notify close complete */
|
||||||
fpi_device_close_complete (FP_DEVICE (self), release_error);
|
fpi_device_close_complete (FP_DEVICE (self), g_steal_pointer (&release_error));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -446,10 +450,16 @@ fpc_evt_cb (FpiDeviceFpcMoc *self,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FPC_EVT_FINGER_DWN:
|
case FPC_EVT_FINGER_DWN:
|
||||||
fp_dbg ("%s Got finger down event", G_STRFUNC);
|
fp_dbg ("%s Got finger down event (%d)", G_STRFUNC, presp->evt_hdr.status);
|
||||||
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||||
FP_FINGER_STATUS_PRESENT,
|
FP_FINGER_STATUS_PRESENT,
|
||||||
FP_FINGER_STATUS_NONE);
|
FP_FINGER_STATUS_NONE);
|
||||||
|
if (presp->evt_hdr.status != 0)
|
||||||
|
{
|
||||||
|
/* Redo the current task state if capture failed */
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, fpi_ssm_get_cur_state (self->task_ssm));
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FPC_EVT_IMG:
|
case FPC_EVT_IMG:
|
||||||
@@ -734,7 +744,7 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
|||||||
case FPC_ENROL_STATUS_COMPLETED:
|
case FPC_ENROL_STATUS_COMPLETED:
|
||||||
self->enroll_stage++;
|
self->enroll_stage++;
|
||||||
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE);
|
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_COMPLETE);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case FPC_ENROL_STATUS_IMAGE_TOO_SIMILAR:
|
case FPC_ENROL_STATUS_IMAGE_TOO_SIMILAR:
|
||||||
@@ -742,15 +752,22 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
|||||||
/* here should tips remove finger and try again */
|
/* here should tips remove finger and try again */
|
||||||
if (self->max_immobile_stage)
|
if (self->max_immobile_stage)
|
||||||
{
|
{
|
||||||
if (self->immobile_stage >= self->max_immobile_stage)
|
self->immobile_stage++;
|
||||||
|
if (self->immobile_stage > self->max_immobile_stage)
|
||||||
{
|
{
|
||||||
fp_dbg ("Skip similar handle due to customer enrollment %d(%d)",
|
fp_dbg ("Skip similar handle due to customer enrollment %d(%d)",
|
||||||
self->immobile_stage, self->max_immobile_stage);
|
self->immobile_stage, self->max_immobile_stage);
|
||||||
/* Skip too similar handle, treat as normal enroll progress. */
|
/* Skip too similar handle, treat as normal enroll progress. */
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROL_STATUS_PROGRESS);
|
self->enroll_stage++;
|
||||||
|
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
||||||
|
/* Used for customer enrollment scheme */
|
||||||
|
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
|
||||||
|
{
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_COMPLETE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
self->immobile_stage++;
|
|
||||||
}
|
}
|
||||||
fpi_device_enroll_progress (FP_DEVICE (self),
|
fpi_device_enroll_progress (FP_DEVICE (self),
|
||||||
self->enroll_stage,
|
self->enroll_stage,
|
||||||
@@ -763,7 +780,10 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
|||||||
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
fpi_device_enroll_progress (FP_DEVICE (self), self->enroll_stage, NULL, NULL);
|
||||||
/* Used for customer enrollment scheme */
|
/* Used for customer enrollment scheme */
|
||||||
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
|
if (self->enroll_stage >= (self->max_enroll_stage - self->max_immobile_stage))
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_COMPLETE);
|
{
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_COMPLETE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE:
|
case FPC_ENROL_STATUS_IMAGE_LOW_COVERAGE:
|
||||||
@@ -796,7 +816,7 @@ fpc_enroll_update_cb (FpiDeviceFpcMoc *self,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE);
|
fpi_ssm_jump_to_state (self->task_ssm, FPC_ENROLL_CAPTURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -924,7 +944,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_ENROLL_ENUM:
|
case FPC_ENROLL_ENUM:
|
||||||
{
|
{
|
||||||
FPC_FID_DATA pquery_data = {0};
|
FPC_FID_DATA pquery_data = {0};
|
||||||
gsize query_data_len = 0;
|
gsize query_data_len = 0;
|
||||||
@@ -949,7 +969,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CREATE:
|
case FPC_ENROLL_CREATE:
|
||||||
{
|
{
|
||||||
recv_data_len = sizeof (FPC_BEGIN_ENROL);
|
recv_data_len = sizeof (FPC_BEGIN_ENROL);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -964,7 +984,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CAPTURE:
|
case FPC_ENROLL_CAPTURE:
|
||||||
{
|
{
|
||||||
guint32 capture_id = FPC_CAPTUREID_RESERVED;
|
guint32 capture_id = FPC_CAPTUREID_RESERVED;
|
||||||
fpi_device_report_finger_status_changes (device,
|
fpi_device_report_finger_status_changes (device,
|
||||||
@@ -982,7 +1002,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_GET_IMG:
|
case FPC_ENROLL_GET_IMG:
|
||||||
{
|
{
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
||||||
cmd_data.request = FPC_CMD_GET_IMG;
|
cmd_data.request = FPC_CMD_GET_IMG;
|
||||||
@@ -996,7 +1016,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_UPDATE:
|
case FPC_ENROLL_UPDATE:
|
||||||
{
|
{
|
||||||
recv_data_len = sizeof (FPC_ENROL);
|
recv_data_len = sizeof (FPC_ENROL);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1011,7 +1031,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_COMPLETE:
|
case FPC_ENROLL_COMPLETE:
|
||||||
{
|
{
|
||||||
recv_data_len = sizeof (FPC_END_ENROL);
|
recv_data_len = sizeof (FPC_END_ENROL);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1026,7 +1046,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CHECK_DUPLICATE:
|
case FPC_ENROLL_CHECK_DUPLICATE:
|
||||||
{
|
{
|
||||||
recv_data_len = sizeof (FPC_IDENTIFY);
|
recv_data_len = sizeof (FPC_IDENTIFY);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1041,7 +1061,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_BINDID:
|
case FPC_ENROLL_BINDID:
|
||||||
{
|
{
|
||||||
FPC_FID_DATA data = {0};
|
FPC_FID_DATA data = {0};
|
||||||
gsize data_len = 0;
|
gsize data_len = 0;
|
||||||
@@ -1095,7 +1115,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_COMMIT:
|
case FPC_ENROLL_COMMIT:
|
||||||
{
|
{
|
||||||
recv_data_len = sizeof (gint32);
|
recv_data_len = sizeof (gint32);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1110,7 +1130,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_DICARD:
|
case FPC_ENROLL_DICARD:
|
||||||
{
|
{
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
|
||||||
cmd_data.request = FPC_CMD_ABORT;
|
cmd_data.request = FPC_CMD_ABORT;
|
||||||
@@ -1123,7 +1143,7 @@ fpc_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CLEANUP:
|
case FPC_ENROLL_CLEANUP:
|
||||||
{
|
{
|
||||||
if (self->do_cleanup == TRUE)
|
if (self->do_cleanup == TRUE)
|
||||||
{
|
{
|
||||||
@@ -1268,7 +1288,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_VERIFY_CAPTURE:
|
case FPC_VERIFY_CAPTURE:
|
||||||
{
|
{
|
||||||
guint32 capture_id = FPC_CAPTUREID_RESERVED;
|
guint32 capture_id = FPC_CAPTUREID_RESERVED;
|
||||||
fpi_device_report_finger_status_changes (device,
|
fpi_device_report_finger_status_changes (device,
|
||||||
@@ -1286,7 +1306,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_GET_IMG:
|
case FPC_VERIFY_GET_IMG:
|
||||||
{
|
{
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
||||||
cmd_data.request = FPC_CMD_GET_IMG;
|
cmd_data.request = FPC_CMD_GET_IMG;
|
||||||
@@ -1300,7 +1320,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_IDENTIFY:
|
case FPC_VERIFY_IDENTIFY:
|
||||||
{
|
{
|
||||||
gsize recv_data_len = sizeof (FPC_IDENTIFY);
|
gsize recv_data_len = sizeof (FPC_IDENTIFY);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1315,7 +1335,7 @@ fpc_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_CANCEL:
|
case FPC_VERIFY_CANCEL:
|
||||||
{
|
{
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE;
|
||||||
cmd_data.request = FPC_CMD_ABORT;
|
cmd_data.request = FPC_CMD_ABORT;
|
||||||
@@ -1385,7 +1405,7 @@ fpc_clear_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_CLEAR_DELETE_DB:
|
case FPC_CLEAR_DELETE_DB:
|
||||||
{
|
{
|
||||||
if (self->dbid)
|
if (self->dbid)
|
||||||
{
|
{
|
||||||
@@ -1412,7 +1432,7 @@ fpc_clear_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CLEAR_CREATE_DB:
|
case FPC_CLEAR_CREATE_DB:
|
||||||
{
|
{
|
||||||
if (self->dbid)
|
if (self->dbid)
|
||||||
{
|
{
|
||||||
@@ -1517,7 +1537,7 @@ fpc_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_INIT:
|
case FPC_INIT:
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
cmd_data.cmdtype = FPC_CMDTYPE_TO_DEVICE_EVTDATA;
|
||||||
cmd_data.request = FPC_CMD_INIT;
|
cmd_data.request = FPC_CMD_INIT;
|
||||||
cmd_data.value = 0x1;
|
cmd_data.value = 0x1;
|
||||||
@@ -1529,7 +1549,7 @@ fpc_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fpc_sensor_cmd (self, FALSE, &cmd_data);
|
fpc_sensor_cmd (self, FALSE, &cmd_data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_LOAD_DB:
|
case FPC_INIT_LOAD_DB:
|
||||||
{
|
{
|
||||||
gsize recv_data_len = sizeof (FPC_LOAD_DB);
|
gsize recv_data_len = sizeof (FPC_LOAD_DB);
|
||||||
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
cmd_data.cmdtype = FPC_CMDTYPE_FROM_DEVICE;
|
||||||
@@ -1620,9 +1640,13 @@ fpc_dev_probe (FpDevice *device)
|
|||||||
{
|
{
|
||||||
case 0xFFE0:
|
case 0xFFE0:
|
||||||
case 0xA305:
|
case 0xA305:
|
||||||
|
case 0xA306:
|
||||||
case 0xD805:
|
case 0xD805:
|
||||||
case 0xDA04:
|
case 0xDA04:
|
||||||
case 0xD205:
|
case 0xD205:
|
||||||
|
case 0x9524:
|
||||||
|
case 0x9544:
|
||||||
|
case 0xC844:
|
||||||
self->max_enroll_stage = MAX_ENROLL_SAMPLES;
|
self->max_enroll_stage = MAX_ENROLL_SAMPLES;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1659,7 +1683,7 @@ fpc_dev_open (FpDevice *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
self->task_ssm = fpi_ssm_new (device, fpc_init_sm_run_state,
|
self->task_ssm = fpi_ssm_new (device, fpc_init_sm_run_state,
|
||||||
FP_INIT_NUM_STATES);
|
FPC_INIT_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fpc_init_ssm_done);
|
fpi_ssm_start (self->task_ssm, fpc_init_ssm_done);
|
||||||
}
|
}
|
||||||
@@ -1671,6 +1695,7 @@ fpc_dev_close (FpDevice *device)
|
|||||||
|
|
||||||
fp_dbg ("%s enter -->", G_STRFUNC);
|
fp_dbg ("%s enter -->", G_STRFUNC);
|
||||||
g_clear_pointer (&self->dbid, g_free);
|
g_clear_pointer (&self->dbid, g_free);
|
||||||
|
g_cancellable_cancel (self->interrupt_cancellable);
|
||||||
g_clear_object (&self->interrupt_cancellable);
|
g_clear_object (&self->interrupt_cancellable);
|
||||||
fpc_dev_release_interface (self, NULL);
|
fpc_dev_release_interface (self, NULL);
|
||||||
}
|
}
|
||||||
@@ -1682,8 +1707,8 @@ fpc_dev_verify_identify (FpDevice *device)
|
|||||||
|
|
||||||
fp_dbg ("%s enter -->", G_STRFUNC);
|
fp_dbg ("%s enter -->", G_STRFUNC);
|
||||||
self->task_ssm = fpi_ssm_new_full (device, fpc_verify_sm_run_state,
|
self->task_ssm = fpi_ssm_new_full (device, fpc_verify_sm_run_state,
|
||||||
FP_VERIFY_NUM_STATES,
|
FPC_VERIFY_NUM_STATES,
|
||||||
FP_VERIFY_CANCEL,
|
FPC_VERIFY_CANCEL,
|
||||||
"verify_identify");
|
"verify_identify");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fpc_verify_ssm_done);
|
fpi_ssm_start (self->task_ssm, fpc_verify_ssm_done);
|
||||||
@@ -1699,8 +1724,8 @@ fpc_dev_enroll (FpDevice *device)
|
|||||||
self->enroll_stage = 0;
|
self->enroll_stage = 0;
|
||||||
self->immobile_stage = 0;
|
self->immobile_stage = 0;
|
||||||
self->task_ssm = fpi_ssm_new_full (device, fpc_enroll_sm_run_state,
|
self->task_ssm = fpi_ssm_new_full (device, fpc_enroll_sm_run_state,
|
||||||
FP_ENROLL_NUM_STATES,
|
FPC_ENROLL_NUM_STATES,
|
||||||
FP_ENROLL_DICARD,
|
FPC_ENROLL_DICARD,
|
||||||
"enroll");
|
"enroll");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fpc_enroll_ssm_done);
|
fpi_ssm_start (self->task_ssm, fpc_enroll_ssm_done);
|
||||||
@@ -1751,7 +1776,7 @@ fpc_dev_suspend (FpDevice *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_assert (self->cmd_ssm);
|
g_assert (self->cmd_ssm);
|
||||||
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FP_CMD_GET_DATA);
|
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FPC_CMD_GET_DATA);
|
||||||
self->cmd_suspended = TRUE;
|
self->cmd_suspended = TRUE;
|
||||||
g_cancellable_cancel (self->interrupt_cancellable);
|
g_cancellable_cancel (self->interrupt_cancellable);
|
||||||
}
|
}
|
||||||
@@ -1773,10 +1798,12 @@ fpc_dev_resume (FpDevice *device)
|
|||||||
|
|
||||||
g_assert (self->cmd_ssm);
|
g_assert (self->cmd_ssm);
|
||||||
g_assert (self->cmd_suspended);
|
g_assert (self->cmd_suspended);
|
||||||
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FP_CMD_SUSPENDED);
|
g_assert (fpi_ssm_get_cur_state (self->cmd_ssm) == FPC_CMD_SUSPENDED);
|
||||||
self->cmd_suspended = FALSE;
|
self->cmd_suspended = FALSE;
|
||||||
g_set_object (&self->interrupt_cancellable, g_cancellable_new ());
|
|
||||||
fpi_ssm_jump_to_state (self->cmd_ssm, FP_CMD_RESUME);
|
g_clear_object (&self->interrupt_cancellable);
|
||||||
|
self->interrupt_cancellable = g_cancellable_new ();
|
||||||
|
fpi_ssm_jump_to_state (self->cmd_ssm, FPC_CMD_RESUME);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1840,8 +1867,8 @@ fpc_dev_clear_storage (FpDevice *device)
|
|||||||
|
|
||||||
fp_dbg ("%s enter -->", G_STRFUNC);
|
fp_dbg ("%s enter -->", G_STRFUNC);
|
||||||
self->task_ssm = fpi_ssm_new_full (device, fpc_clear_sm_run_state,
|
self->task_ssm = fpi_ssm_new_full (device, fpc_clear_sm_run_state,
|
||||||
FP_CLEAR_NUM_STATES,
|
FPC_CLEAR_NUM_STATES,
|
||||||
FP_CLEAR_NUM_STATES,
|
FPC_CLEAR_NUM_STATES,
|
||||||
"Clear storage");
|
"Clear storage");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fpc_clear_ssm_done);
|
fpi_ssm_start (self->task_ssm, fpc_clear_ssm_done);
|
||||||
|
|||||||
@@ -178,44 +178,44 @@ typedef enum {
|
|||||||
} FpcCmdType;
|
} FpcCmdType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_CMD_SEND = 0,
|
FPC_CMD_SEND = 0,
|
||||||
FP_CMD_GET_DATA,
|
FPC_CMD_GET_DATA,
|
||||||
FP_CMD_SUSPENDED,
|
FPC_CMD_SUSPENDED,
|
||||||
FP_CMD_RESUME,
|
FPC_CMD_RESUME,
|
||||||
FP_CMD_NUM_STATES,
|
FPC_CMD_NUM_STATES,
|
||||||
} FpCmdState;
|
} FpcCmdState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_INIT = 0,
|
FPC_INIT = 0,
|
||||||
FP_LOAD_DB,
|
FPC_INIT_LOAD_DB,
|
||||||
FP_INIT_NUM_STATES,
|
FPC_INIT_NUM_STATES,
|
||||||
} FpInitState;
|
} FpcInitState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_ENROLL_ENUM = 0,
|
FPC_ENROLL_ENUM = 0,
|
||||||
FP_ENROLL_CREATE,
|
FPC_ENROLL_CREATE,
|
||||||
FP_ENROLL_CAPTURE,
|
FPC_ENROLL_CAPTURE,
|
||||||
FP_ENROLL_GET_IMG,
|
FPC_ENROLL_GET_IMG,
|
||||||
FP_ENROLL_UPDATE,
|
FPC_ENROLL_UPDATE,
|
||||||
FP_ENROLL_COMPLETE,
|
FPC_ENROLL_COMPLETE,
|
||||||
FP_ENROLL_CHECK_DUPLICATE,
|
FPC_ENROLL_CHECK_DUPLICATE,
|
||||||
FP_ENROLL_BINDID,
|
FPC_ENROLL_BINDID,
|
||||||
FP_ENROLL_COMMIT,
|
FPC_ENROLL_COMMIT,
|
||||||
FP_ENROLL_DICARD,
|
FPC_ENROLL_DICARD,
|
||||||
FP_ENROLL_CLEANUP,
|
FPC_ENROLL_CLEANUP,
|
||||||
FP_ENROLL_NUM_STATES,
|
FPC_ENROLL_NUM_STATES,
|
||||||
} FpEnrollState;
|
} FpcEnrollState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_VERIFY_CAPTURE = 0,
|
FPC_VERIFY_CAPTURE = 0,
|
||||||
FP_VERIFY_GET_IMG,
|
FPC_VERIFY_GET_IMG,
|
||||||
FP_VERIFY_IDENTIFY,
|
FPC_VERIFY_IDENTIFY,
|
||||||
FP_VERIFY_CANCEL,
|
FPC_VERIFY_CANCEL,
|
||||||
FP_VERIFY_NUM_STATES,
|
FPC_VERIFY_NUM_STATES,
|
||||||
} FpVerifyState;
|
} FpcVerifyState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_CLEAR_DELETE_DB = 0,
|
FPC_CLEAR_DELETE_DB = 0,
|
||||||
FP_CLEAR_CREATE_DB,
|
FPC_CLEAR_CREATE_DB,
|
||||||
FP_CLEAR_NUM_STATES,
|
FPC_CLEAR_NUM_STATES,
|
||||||
} FpClearState;
|
} FpClearState;
|
||||||
|
|||||||
@@ -128,11 +128,13 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
||||||
|
FpiByteReader reader = {0};
|
||||||
CommandData *data = user_data;
|
CommandData *data = user_data;
|
||||||
int ret = -1, ssm_state = 0;
|
int ssm_state = 0;
|
||||||
gxfp_cmd_response_t cmd_reponse = {0, };
|
gxfp_cmd_response_t cmd_reponse = {0, };
|
||||||
pack_header header;
|
pack_header header;
|
||||||
guint32 crc32_calc = 0;
|
guint32 crc32_calc = 0;
|
||||||
|
guint32 crc32 = 0;
|
||||||
guint16 cmd = 0;
|
guint16 cmd = 0;
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
@@ -154,8 +156,10 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = gx_proto_parse_header (transfer->buffer, transfer->actual_length, &header);
|
reader.data = transfer->buffer;
|
||||||
if (ret != 0)
|
reader.size = transfer->actual_length;
|
||||||
|
|
||||||
|
if (gx_proto_parse_header (&reader, &header) != 0)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (transfer->ssm,
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
@@ -163,8 +167,17 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_set_pos (&reader, PACKAGE_HEADER_SIZE + header.len))
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
|
"Package crc read failed"));
|
||||||
|
}
|
||||||
|
|
||||||
gx_proto_crc32_calc (transfer->buffer, PACKAGE_HEADER_SIZE + header.len, (uint8_t *) &crc32_calc);
|
gx_proto_crc32_calc (transfer->buffer, PACKAGE_HEADER_SIZE + header.len, (uint8_t *) &crc32_calc);
|
||||||
if(crc32_calc != GUINT32_FROM_LE (*(uint32_t *) (transfer->buffer + PACKAGE_HEADER_SIZE + header.len)))
|
|
||||||
|
if (!fpi_byte_reader_get_uint32_le (&reader, &crc32) ||
|
||||||
|
crc32_calc != crc32)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (transfer->ssm,
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
@@ -174,8 +187,11 @@ fp_cmd_receive_cb (FpiUsbTransfer *transfer,
|
|||||||
|
|
||||||
cmd = MAKE_CMD_EX (header.cmd0, header.cmd1);
|
cmd = MAKE_CMD_EX (header.cmd0, header.cmd1);
|
||||||
|
|
||||||
ret = gx_proto_parse_body (cmd, &transfer->buffer[PACKAGE_HEADER_SIZE], header.len, &cmd_reponse);
|
fpi_byte_reader_set_pos (&reader, 0);
|
||||||
if (ret != 0)
|
reader.data = &transfer->buffer[PACKAGE_HEADER_SIZE];
|
||||||
|
reader.size = header.len;
|
||||||
|
|
||||||
|
if (gx_proto_parse_body (cmd, &reader, &cmd_reponse) != 0)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (transfer->ssm,
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
@@ -222,7 +238,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_CMD_SEND:
|
case GOODIX_CMD_SEND:
|
||||||
if (self->cmd_transfer)
|
if (self->cmd_transfer)
|
||||||
{
|
{
|
||||||
self->cmd_transfer->ssm = ssm;
|
self->cmd_transfer->ssm = ssm;
|
||||||
@@ -238,7 +254,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_GET_ACK:
|
case GOODIX_CMD_GET_ACK:
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
||||||
@@ -250,7 +266,7 @@ fp_cmd_run_state (FpiSsm *ssm,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_CMD_GET_DATA:
|
case GOODIX_CMD_GET_DATA:
|
||||||
transfer = fpi_usb_transfer_new (dev);
|
transfer = fpi_usb_transfer_new (dev);
|
||||||
transfer->ssm = ssm;
|
transfer->ssm = ssm;
|
||||||
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
fpi_usb_transfer_fill_bulk (transfer, EP_IN, EP_IN_MAX_BUF_SIZE);
|
||||||
@@ -338,7 +354,7 @@ goodix_sensor_cmd (FpiDeviceGoodixMoc *self,
|
|||||||
|
|
||||||
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
self->cmd_ssm = fpi_ssm_new (FP_DEVICE (self),
|
||||||
fp_cmd_run_state,
|
fp_cmd_run_state,
|
||||||
FP_CMD_NUM_STATES);
|
GOODIX_CMD_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
fpi_ssm_set_data (self->cmd_ssm, data, (GDestroyNotify) fp_cmd_ssm_done_data_free);
|
||||||
|
|
||||||
@@ -464,6 +480,35 @@ fp_verify_cb (FpiDeviceGoodixMoc *self,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_verify_finger_mode_cb (FpiDeviceGoodixMoc *self,
|
||||||
|
gxfp_cmd_response_t *resp,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* if reach max timeout(5sec) finger not up, try again */
|
||||||
|
if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT)
|
||||||
|
{
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_VERIFY_WAIT_FINGER_UP);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (resp->finger_status.status != GX_SUCCESS)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm,
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
|
"Switch finger mode failed"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||||
|
FP_FINGER_STATUS_NONE,
|
||||||
|
FP_FINGER_STATUS_PRESENT);
|
||||||
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
||||||
{
|
{
|
||||||
@@ -477,7 +522,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_VERIFY_PWR_BTN_SHIELD_ON:
|
case GOODIX_VERIFY_PWR_BTN_SHIELD_ON:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
|
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
|
||||||
false,
|
false,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -485,7 +530,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_pwr_btn_shield_cb);
|
fp_pwr_btn_shield_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_CAPTURE:
|
case GOODIX_VERIFY_CAPTURE:
|
||||||
fpi_device_report_finger_status_changes (device,
|
fpi_device_report_finger_status_changes (device,
|
||||||
FP_FINGER_STATUS_NEEDED,
|
FP_FINGER_STATUS_NEEDED,
|
||||||
FP_FINGER_STATUS_NONE);
|
FP_FINGER_STATUS_NONE);
|
||||||
@@ -496,7 +541,7 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_verify_capture_cb);
|
fp_verify_capture_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_IDENTIFY:
|
case GOODIX_VERIFY_IDENTIFY:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_IDENTIFY, MOC_CMD1_DEFAULT,
|
goodix_sensor_cmd (self, MOC_CMD0_IDENTIFY, MOC_CMD1_DEFAULT,
|
||||||
false,
|
false,
|
||||||
(const guint8 *) nonce,
|
(const guint8 *) nonce,
|
||||||
@@ -504,7 +549,18 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_verify_cb);
|
fp_verify_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_VERIFY_PWR_BTN_SHIELD_OFF:
|
case GOODIX_VERIFY_WAIT_FINGER_UP:
|
||||||
|
{
|
||||||
|
guint8 dummy = 0;
|
||||||
|
goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP,
|
||||||
|
true,
|
||||||
|
&dummy,
|
||||||
|
1,
|
||||||
|
fp_verify_finger_mode_cb);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GOODIX_VERIFY_PWR_BTN_SHIELD_OFF:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
|
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
|
||||||
false,
|
false,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -666,7 +722,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
|
|||||||
self->enroll_stage,
|
self->enroll_stage,
|
||||||
NULL,
|
NULL,
|
||||||
fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL));
|
fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL));
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||||
@@ -684,7 +740,7 @@ fp_enroll_capture_cb (FpiDeviceGoodixMoc *self,
|
|||||||
self->enroll_stage,
|
self->enroll_stage,
|
||||||
NULL,
|
NULL,
|
||||||
fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER));
|
fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER));
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -730,7 +786,7 @@ fp_enroll_update_cb (FpiDeviceGoodixMoc *self,
|
|||||||
/* if enroll complete, no need to wait finger up */
|
/* if enroll complete, no need to wait finger up */
|
||||||
if (self->enroll_stage >= self->max_enroll_stage)
|
if (self->enroll_stage >= self->max_enroll_stage)
|
||||||
{
|
{
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CHECK_DUPLICATE);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CHECK_DUPLICATE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -796,7 +852,7 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self,
|
|||||||
/* if reach max timeout(5sec) finger not up, switch to finger up again */
|
/* if reach max timeout(5sec) finger not up, switch to finger up again */
|
||||||
if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT)
|
if (resp->finger_status.status == GX_ERROR_WAIT_FINGER_UP_TIMEOUT)
|
||||||
{
|
{
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_WAIT_FINGER_UP);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_WAIT_FINGER_UP);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (resp->finger_status.status != GX_SUCCESS)
|
else if (resp->finger_status.status != GX_SUCCESS)
|
||||||
@@ -811,7 +867,7 @@ fp_finger_mode_cb (FpiDeviceGoodixMoc *self,
|
|||||||
FP_FINGER_STATUS_PRESENT);
|
FP_FINGER_STATUS_PRESENT);
|
||||||
if (self->enroll_stage < self->max_enroll_stage)
|
if (self->enroll_stage < self->max_enroll_stage)
|
||||||
{
|
{
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_ENROLL_CAPTURE);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_ENROLL_CAPTURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fpi_ssm_next_state (self->task_ssm);
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
@@ -837,7 +893,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_ENROLL_PWR_BTN_SHIELD_ON:
|
case GOODIX_ENROLL_PWR_BTN_SHIELD_ON:
|
||||||
{
|
{
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
|
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_ON,
|
||||||
false,
|
false,
|
||||||
@@ -847,7 +903,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_ENUM:
|
case GOODIX_ENROLL_ENUM:
|
||||||
{
|
{
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT,
|
goodix_sensor_cmd (self, MOC_CMD0_GETFINGERLIST, MOC_CMD1_DEFAULT,
|
||||||
false,
|
false,
|
||||||
@@ -857,7 +913,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CREATE:
|
case GOODIX_ENROLL_CREATE:
|
||||||
{
|
{
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_ENROLL_INIT, MOC_CMD1_DEFAULT,
|
goodix_sensor_cmd (self, MOC_CMD0_ENROLL_INIT, MOC_CMD1_DEFAULT,
|
||||||
false,
|
false,
|
||||||
@@ -867,7 +923,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CAPTURE:
|
case GOODIX_ENROLL_CAPTURE:
|
||||||
fpi_device_report_finger_status_changes (device,
|
fpi_device_report_finger_status_changes (device,
|
||||||
FP_FINGER_STATUS_NEEDED,
|
FP_FINGER_STATUS_NEEDED,
|
||||||
FP_FINGER_STATUS_NONE);
|
FP_FINGER_STATUS_NONE);
|
||||||
@@ -878,7 +934,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_enroll_capture_cb);
|
fp_enroll_capture_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_UPDATE:
|
case GOODIX_ENROLL_UPDATE:
|
||||||
dummy[0] = 1;
|
dummy[0] = 1;
|
||||||
dummy[1] = self->sensorcfg->config[2];
|
dummy[1] = self->sensorcfg->config[2];
|
||||||
dummy[2] = self->sensorcfg->config[3];
|
dummy[2] = self->sensorcfg->config[3];
|
||||||
@@ -889,7 +945,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_enroll_update_cb);
|
fp_enroll_update_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_WAIT_FINGER_UP:
|
case GOODIX_ENROLL_WAIT_FINGER_UP:
|
||||||
dummy[0] = 0;
|
dummy[0] = 0;
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP,
|
goodix_sensor_cmd (self, MOC_CMD0_FINGER_MODE, MOC_CMD1_SET_FINGER_UP,
|
||||||
true,
|
true,
|
||||||
@@ -898,7 +954,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_finger_mode_cb);
|
fp_finger_mode_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_CHECK_DUPLICATE:
|
case GOODIX_ENROLL_CHECK_DUPLICATE:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_CHECK4DUPLICATE, MOC_CMD1_DEFAULT,
|
goodix_sensor_cmd (self, MOC_CMD0_CHECK4DUPLICATE, MOC_CMD1_DEFAULT,
|
||||||
false,
|
false,
|
||||||
(const guint8 *) &dummy,
|
(const guint8 *) &dummy,
|
||||||
@@ -906,7 +962,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_enroll_check_duplicate_cb);
|
fp_enroll_check_duplicate_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_COMMIT:
|
case GOODIX_ENROLL_COMMIT:
|
||||||
{
|
{
|
||||||
fpi_device_get_enroll_data (device, &print);
|
fpi_device_get_enroll_data (device, &print);
|
||||||
user_id = fpi_print_generate_user_id (print);
|
user_id = fpi_print_generate_user_id (print);
|
||||||
@@ -959,7 +1015,7 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_ENROLL_PWR_BTN_SHIELD_OFF:
|
case GOODIX_ENROLL_PWR_BTN_SHIELD_OFF:
|
||||||
{
|
{
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
|
goodix_sensor_cmd (self, MOC_CMD0_PWR_BTN_SHIELD, MOC_CMD1_PWR_BTN_SHIELD_OFF,
|
||||||
false,
|
false,
|
||||||
@@ -1050,7 +1106,7 @@ fp_init_cb_reset_or_complete (FpiDeviceGoodixMoc *self,
|
|||||||
{
|
{
|
||||||
fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message);
|
fp_warn ("Template storage appears to have been corrupted! Error was: %s", error->message);
|
||||||
fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized.");
|
fp_warn ("A known reason for this to happen is a firmware bug triggered by another storage area being initialized.");
|
||||||
fpi_ssm_jump_to_state (self->task_ssm, FP_INIT_RESET_DEVICE);
|
fpi_ssm_jump_to_state (self->task_ssm, GOODIX_INIT_RESET_DEVICE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1091,7 +1147,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
case FP_INIT_VERSION:
|
case GOODIX_INIT_VERSION:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_GET_VERSION, MOC_CMD1_DEFAULT,
|
goodix_sensor_cmd (self, MOC_CMD0_GET_VERSION, MOC_CMD1_DEFAULT,
|
||||||
false,
|
false,
|
||||||
&dummy,
|
&dummy,
|
||||||
@@ -1099,7 +1155,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_init_version_cb);
|
fp_init_version_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_INIT_CONFIG:
|
case GOODIX_INIT_CONFIG:
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_UPDATE_CONFIG, MOC_CMD1_WRITE_CFG_TO_FLASH,
|
goodix_sensor_cmd (self, MOC_CMD0_UPDATE_CONFIG, MOC_CMD1_WRITE_CFG_TO_FLASH,
|
||||||
false,
|
false,
|
||||||
(guint8 *) self->sensorcfg,
|
(guint8 *) self->sensorcfg,
|
||||||
@@ -1107,7 +1163,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_init_config_cb);
|
fp_init_config_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_INIT_TEMPLATE_LIST:
|
case GOODIX_INIT_TEMPLATE_LIST:
|
||||||
/* List prints to check whether the template DB was corrupted.
|
/* List prints to check whether the template DB was corrupted.
|
||||||
* As of 2022-06-13 there is a known firmware issue that can cause the
|
* As of 2022-06-13 there is a known firmware issue that can cause the
|
||||||
* stored templates for Linux to be corrupted when the Windows storage
|
* stored templates for Linux to be corrupted when the Windows storage
|
||||||
@@ -1122,7 +1178,7 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fp_init_cb_reset_or_complete);
|
fp_init_cb_reset_or_complete);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_INIT_RESET_DEVICE:
|
case GOODIX_INIT_RESET_DEVICE:
|
||||||
fp_warn ("Resetting device storage, you will need to enroll all prints again!");
|
fp_warn ("Resetting device storage, you will need to enroll all prints again!");
|
||||||
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
|
goodix_sensor_cmd (self, MOC_CMD0_DELETETEMPLATE, MOC_CMD1_DELETE_ALL,
|
||||||
FALSE,
|
FALSE,
|
||||||
@@ -1363,8 +1419,10 @@ gx_fp_probe (FpDevice *device)
|
|||||||
case 0x6014:
|
case 0x6014:
|
||||||
case 0x6092:
|
case 0x6092:
|
||||||
case 0x6094:
|
case 0x6094:
|
||||||
|
case 0x609A:
|
||||||
case 0x609C:
|
case 0x609C:
|
||||||
case 0x60BC:
|
case 0x60BC:
|
||||||
|
case 0x60C2:
|
||||||
case 0x6304:
|
case 0x6304:
|
||||||
case 0x631C:
|
case 0x631C:
|
||||||
case 0x633C:
|
case 0x633C:
|
||||||
@@ -1374,6 +1432,8 @@ gx_fp_probe (FpDevice *device)
|
|||||||
case 0x63AC:
|
case 0x63AC:
|
||||||
case 0x63BC:
|
case 0x63BC:
|
||||||
case 0x63CC:
|
case 0x63CC:
|
||||||
|
case 0x650A:
|
||||||
|
case 0x650C:
|
||||||
case 0x6582:
|
case 0x6582:
|
||||||
case 0x6A94:
|
case 0x6A94:
|
||||||
case 0x659A:
|
case 0x659A:
|
||||||
@@ -1432,7 +1492,7 @@ gx_fp_init (FpDevice *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
self->task_ssm = fpi_ssm_new (device, fp_init_sm_run_state,
|
self->task_ssm = fpi_ssm_new (device, fp_init_sm_run_state,
|
||||||
FP_INIT_NUM_STATES);
|
GOODIX_INIT_NUM_STATES);
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fp_init_ssm_done);
|
fpi_ssm_start (self->task_ssm, fp_init_ssm_done);
|
||||||
|
|
||||||
@@ -1463,9 +1523,7 @@ gx_fp_exit_cb (FpiDeviceGoodixMoc *self,
|
|||||||
gxfp_cmd_response_t *resp,
|
gxfp_cmd_response_t *resp,
|
||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
|
if (resp && resp->result >= GX_FAILED)
|
||||||
|
|
||||||
if (resp->result >= GX_FAILED)
|
|
||||||
fp_dbg ("Setting power button shield failed, result: 0x%x", resp->result);
|
fp_dbg ("Setting power button shield failed, result: 0x%x", resp->result);
|
||||||
self->is_power_button_shield_on = false;
|
self->is_power_button_shield_on = false;
|
||||||
gx_fp_release_interface (self, error);
|
gx_fp_release_interface (self, error);
|
||||||
@@ -1500,8 +1558,8 @@ gx_fp_verify_identify (FpDevice *device)
|
|||||||
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
FpiDeviceGoodixMoc *self = FPI_DEVICE_GOODIXMOC (device);
|
||||||
|
|
||||||
self->task_ssm = fpi_ssm_new_full (device, fp_verify_sm_run_state,
|
self->task_ssm = fpi_ssm_new_full (device, fp_verify_sm_run_state,
|
||||||
FP_VERIFY_NUM_STATES,
|
GOODIX_VERIFY_NUM_STATES,
|
||||||
FP_VERIFY_PWR_BTN_SHIELD_OFF,
|
GOODIX_VERIFY_PWR_BTN_SHIELD_OFF,
|
||||||
"verify");
|
"verify");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
|
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
|
||||||
@@ -1517,8 +1575,8 @@ gx_fp_enroll (FpDevice *device)
|
|||||||
self->enroll_stage = 0;
|
self->enroll_stage = 0;
|
||||||
|
|
||||||
self->task_ssm = fpi_ssm_new_full (device, fp_enroll_sm_run_state,
|
self->task_ssm = fpi_ssm_new_full (device, fp_enroll_sm_run_state,
|
||||||
FP_ENROLL_NUM_STATES,
|
GOODIX_ENROLL_NUM_STATES,
|
||||||
FP_ENROLL_PWR_BTN_SHIELD_OFF,
|
GOODIX_ENROLL_PWR_BTN_SHIELD_OFF,
|
||||||
"enroll");
|
"enroll");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
|
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
|
||||||
@@ -1610,10 +1668,12 @@ static const FpIdEntry id_table[] = {
|
|||||||
{ .vid = 0x27c6, .pid = 0x6014, },
|
{ .vid = 0x27c6, .pid = 0x6014, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6092, },
|
{ .vid = 0x27c6, .pid = 0x6092, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6094, },
|
{ .vid = 0x27c6, .pid = 0x6094, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x609A, },
|
||||||
{ .vid = 0x27c6, .pid = 0x609C, },
|
{ .vid = 0x27c6, .pid = 0x609C, },
|
||||||
{ .vid = 0x27c6, .pid = 0x60A2, },
|
{ .vid = 0x27c6, .pid = 0x60A2, },
|
||||||
{ .vid = 0x27c6, .pid = 0x60A4, },
|
{ .vid = 0x27c6, .pid = 0x60A4, },
|
||||||
{ .vid = 0x27c6, .pid = 0x60BC, },
|
{ .vid = 0x27c6, .pid = 0x60BC, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x60C2, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6304, },
|
{ .vid = 0x27c6, .pid = 0x6304, },
|
||||||
{ .vid = 0x27c6, .pid = 0x631C, },
|
{ .vid = 0x27c6, .pid = 0x631C, },
|
||||||
{ .vid = 0x27c6, .pid = 0x633C, },
|
{ .vid = 0x27c6, .pid = 0x633C, },
|
||||||
@@ -1624,6 +1684,8 @@ static const FpIdEntry id_table[] = {
|
|||||||
{ .vid = 0x27c6, .pid = 0x63BC, },
|
{ .vid = 0x27c6, .pid = 0x63BC, },
|
||||||
{ .vid = 0x27c6, .pid = 0x63CC, },
|
{ .vid = 0x27c6, .pid = 0x63CC, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6496, },
|
{ .vid = 0x27c6, .pid = 0x6496, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x650A, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x650C, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6582, },
|
{ .vid = 0x27c6, .pid = 0x6582, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6584, },
|
{ .vid = 0x27c6, .pid = 0x6584, },
|
||||||
{ .vid = 0x27c6, .pid = 0x658C, },
|
{ .vid = 0x27c6, .pid = 0x658C, },
|
||||||
@@ -1632,6 +1694,9 @@ static const FpIdEntry id_table[] = {
|
|||||||
{ .vid = 0x27c6, .pid = 0x659A, },
|
{ .vid = 0x27c6, .pid = 0x659A, },
|
||||||
{ .vid = 0x27c6, .pid = 0x659C, },
|
{ .vid = 0x27c6, .pid = 0x659C, },
|
||||||
{ .vid = 0x27c6, .pid = 0x6A94, },
|
{ .vid = 0x27c6, .pid = 0x6A94, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x6512, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x689A, },
|
||||||
|
{ .vid = 0x27c6, .pid = 0x66A9, },
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -25,39 +25,40 @@
|
|||||||
G_DECLARE_FINAL_TYPE (FpiDeviceGoodixMoc, fpi_device_goodixmoc, FPI, DEVICE_GOODIXMOC, FpDevice)
|
G_DECLARE_FINAL_TYPE (FpiDeviceGoodixMoc, fpi_device_goodixmoc, FPI, DEVICE_GOODIXMOC, FpDevice)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_CMD_SEND = 0,
|
GOODIX_CMD_SEND = 0,
|
||||||
FP_CMD_GET_ACK,
|
GOODIX_CMD_GET_ACK,
|
||||||
FP_CMD_GET_DATA,
|
GOODIX_CMD_GET_DATA,
|
||||||
FP_CMD_NUM_STATES,
|
GOODIX_CMD_NUM_STATES,
|
||||||
} FpCmdState;
|
} GoodixCmdState;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_INIT_VERSION = 0,
|
GOODIX_INIT_VERSION = 0,
|
||||||
FP_INIT_CONFIG,
|
GOODIX_INIT_CONFIG,
|
||||||
FP_INIT_TEMPLATE_LIST,
|
GOODIX_INIT_TEMPLATE_LIST,
|
||||||
FP_INIT_RESET_DEVICE,
|
GOODIX_INIT_RESET_DEVICE,
|
||||||
FP_INIT_NUM_STATES,
|
GOODIX_INIT_NUM_STATES,
|
||||||
} FpInitState;
|
} GoodixInitState;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_ENROLL_PWR_BTN_SHIELD_ON = 0,
|
GOODIX_ENROLL_PWR_BTN_SHIELD_ON = 0,
|
||||||
FP_ENROLL_ENUM,
|
GOODIX_ENROLL_ENUM,
|
||||||
FP_ENROLL_CREATE,
|
GOODIX_ENROLL_CREATE,
|
||||||
FP_ENROLL_CAPTURE,
|
GOODIX_ENROLL_CAPTURE,
|
||||||
FP_ENROLL_UPDATE,
|
GOODIX_ENROLL_UPDATE,
|
||||||
FP_ENROLL_WAIT_FINGER_UP,
|
GOODIX_ENROLL_WAIT_FINGER_UP,
|
||||||
FP_ENROLL_CHECK_DUPLICATE,
|
GOODIX_ENROLL_CHECK_DUPLICATE,
|
||||||
FP_ENROLL_COMMIT,
|
GOODIX_ENROLL_COMMIT,
|
||||||
FP_ENROLL_PWR_BTN_SHIELD_OFF,
|
GOODIX_ENROLL_PWR_BTN_SHIELD_OFF,
|
||||||
FP_ENROLL_NUM_STATES,
|
GOODIX_ENROLL_NUM_STATES,
|
||||||
} FpEnrollState;
|
} GoodixEnrollState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_VERIFY_PWR_BTN_SHIELD_ON = 0,
|
GOODIX_VERIFY_PWR_BTN_SHIELD_ON = 0,
|
||||||
FP_VERIFY_CAPTURE,
|
GOODIX_VERIFY_CAPTURE,
|
||||||
FP_VERIFY_IDENTIFY,
|
GOODIX_VERIFY_IDENTIFY,
|
||||||
FP_VERIFY_PWR_BTN_SHIELD_OFF,
|
GOODIX_VERIFY_WAIT_FINGER_UP,
|
||||||
FP_VERIFY_NUM_STATES,
|
GOODIX_VERIFY_PWR_BTN_SHIELD_OFF,
|
||||||
} FpVerifyState;
|
GOODIX_VERIFY_NUM_STATES,
|
||||||
|
} GoodixVerifyState;
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "goodix_proto.h"
|
#include "goodix_proto.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -107,7 +109,7 @@ reflect (uint32_t data, uint8_t n_bits)
|
|||||||
* If the LSB bit is set, set the reflection of it.
|
* If the LSB bit is set, set the reflection of it.
|
||||||
*/
|
*/
|
||||||
if (data & 0x01)
|
if (data & 0x01)
|
||||||
reflection |= (1 << ((n_bits - 1) - bit));
|
reflection |= (1LU << ((n_bits - 1) - bit));
|
||||||
|
|
||||||
data = (data >> 1);
|
data = (data >> 1);
|
||||||
}
|
}
|
||||||
@@ -211,7 +213,11 @@ gx_proto_build_package (uint8_t *ppackage,
|
|||||||
init_pack_header (&header, payload_size, cmd, 0);
|
init_pack_header (&header, payload_size, cmd, 0);
|
||||||
|
|
||||||
memcpy (ppackage, &header, PACKAGE_HEADER_SIZE);
|
memcpy (ppackage, &header, PACKAGE_HEADER_SIZE);
|
||||||
|
|
||||||
|
if (payload)
|
||||||
memcpy (ppackage + PACKAGE_HEADER_SIZE, payload, payload_size);
|
memcpy (ppackage + PACKAGE_HEADER_SIZE, payload, payload_size);
|
||||||
|
else
|
||||||
|
ppackage[PACKAGE_HEADER_SIZE] = 0;
|
||||||
|
|
||||||
gx_proto_crc32_calc (ppackage, PACKAGE_HEADER_SIZE + payload_size, ppackage + PACKAGE_HEADER_SIZE + payload_size);
|
gx_proto_crc32_calc (ppackage, PACKAGE_HEADER_SIZE + payload_size, ppackage + PACKAGE_HEADER_SIZE + payload_size);
|
||||||
|
|
||||||
@@ -220,94 +226,108 @@ gx_proto_build_package (uint8_t *ppackage,
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
gx_proto_parse_header (
|
gx_proto_parse_header (FpiByteReader *reader,
|
||||||
uint8_t *buffer,
|
|
||||||
uint32_t buffer_len,
|
|
||||||
pack_header *pheader)
|
pack_header *pheader)
|
||||||
{
|
{
|
||||||
if (!buffer || !pheader)
|
if (!pheader)
|
||||||
return -1;
|
|
||||||
if (buffer_len < PACKAGE_HEADER_SIZE + PACKAGE_CRC_SIZE)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memcpy (pheader, buffer, sizeof (pack_header));
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd0))
|
||||||
pheader->len = GUINT16_FROM_LE (pheader->len);
|
g_return_val_if_reached (-1);
|
||||||
if (buffer_len < pheader->len + PACKAGE_HEADER_SIZE)
|
|
||||||
return -1;
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->cmd1))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->packagenum))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->reserved))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint16_le (reader, &pheader->len))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->crc8))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (reader, &pheader->rev_crc8))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
pheader->len -= PACKAGE_CRC_SIZE;
|
pheader->len -= PACKAGE_CRC_SIZE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
gx_proto_parse_fingerid (
|
gx_proto_parse_fingerid (FpiByteReader *reader,
|
||||||
uint8_t * fid_buffer,
|
ptemplate_format_t template)
|
||||||
uint16_t fid_buffer_size,
|
|
||||||
ptemplate_format_t template
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
uint8_t * buffer = NULL;
|
uint8_t byte;
|
||||||
uint16_t Offset = 0;
|
const uint8_t *buffer;
|
||||||
|
|
||||||
if (!template || !fid_buffer)
|
if (!template)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (fid_buffer_size < G_STRUCT_OFFSET (template_format_t, payload) + sizeof (uint32_t))
|
if (!fpi_byte_reader_get_uint8 (reader, &byte) || byte != 67)
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
buffer = fid_buffer;
|
if (!fpi_byte_reader_get_uint8 (reader, &template->type))
|
||||||
Offset = 0;
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
if (buffer[Offset++] != 67)
|
if (!fpi_byte_reader_get_uint8 (reader, &template->finger_index))
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
template->type = buffer[Offset++];
|
if (!fpi_byte_reader_skip (reader, 1))
|
||||||
template->finger_index = buffer[Offset++];
|
g_return_val_if_reached (-1);
|
||||||
Offset++;
|
|
||||||
memcpy (template->accountid, &buffer[Offset], sizeof (template->accountid));
|
if (!fpi_byte_reader_get_data (reader, sizeof (template->accountid), &buffer))
|
||||||
Offset += sizeof (template->accountid);
|
g_return_val_if_reached (-1);
|
||||||
memcpy (template->tid, &buffer[Offset], sizeof (template->tid));
|
|
||||||
Offset += sizeof (template->tid); // Offset == 68
|
memcpy (template->accountid, buffer, sizeof (template->accountid));
|
||||||
template->payload.size = buffer[Offset++];
|
|
||||||
if (template->payload.size > sizeof (template->payload.data))
|
if (!fpi_byte_reader_get_data (reader, sizeof (template->tid), &buffer))
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
if (template->payload.size + Offset > fid_buffer_size)
|
|
||||||
return -1;
|
memcpy (template->tid, buffer, sizeof (template->tid));
|
||||||
memset (template->payload.data, 0, template->payload.size);
|
|
||||||
memcpy (template->payload.data, &buffer[Offset], template->payload.size);
|
if (!fpi_byte_reader_get_uint8 (reader, &template->payload.size))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_data (reader, template->payload.size, &buffer))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
memcpy (template->payload.data, buffer, template->payload.size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_cmd_response_t presp)
|
gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_response_t presp)
|
||||||
{
|
{
|
||||||
uint16_t offset = 0;
|
if (!presp)
|
||||||
uint8_t *fingerlist = NULL;
|
return -1;
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (byte_reader, &presp->result))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
if (!buffer || !presp)
|
|
||||||
return -1;
|
|
||||||
if (buffer_len < 1)
|
|
||||||
return -1;
|
|
||||||
presp->result = buffer[0];
|
|
||||||
switch (HIBYTE (cmd))
|
switch (HIBYTE (cmd))
|
||||||
{
|
{
|
||||||
case RESPONSE_PACKAGE_CMD:
|
case RESPONSE_PACKAGE_CMD:
|
||||||
{
|
{
|
||||||
if (buffer_len < sizeof (gxfp_parse_msg_t) + 1)
|
if (!fpi_byte_reader_get_uint8 (byte_reader, &presp->parse_msg.ack_cmd))
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
presp->parse_msg.ack_cmd = buffer[1];
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_UPDATE_CONFIG:
|
case MOC_CMD0_UPDATE_CONFIG:
|
||||||
{
|
{
|
||||||
presp->finger_config.status = buffer[0];
|
presp->finger_config.status = presp->result;
|
||||||
if (buffer_len >= 3)
|
|
||||||
presp->finger_config.max_stored_prints = buffer[2];
|
|
||||||
else
|
|
||||||
/* to compatiable old version firmware */
|
/* to compatiable old version firmware */
|
||||||
presp->finger_config.max_stored_prints = FP_MAX_FINGERNUM;
|
presp->finger_config.max_stored_prints = FP_MAX_FINGERNUM;
|
||||||
|
|
||||||
|
if (fpi_byte_reader_skip (byte_reader, 1))
|
||||||
|
fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
|
&presp->finger_config.max_stored_prints);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -318,85 +338,99 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
|
|
||||||
case MOC_CMD0_PWR_BTN_SHIELD:
|
case MOC_CMD0_PWR_BTN_SHIELD:
|
||||||
presp->power_button_shield_resp.resp_cmd1 = LOBYTE (cmd);
|
presp->power_button_shield_resp.resp_cmd1 = LOBYTE (cmd);
|
||||||
if (buffer_len >= 2)
|
uint8_t support_pwr_shield;
|
||||||
{
|
|
||||||
uint8_t support_pwr_shield = buffer[1];
|
if (fpi_byte_reader_get_uint8 (byte_reader, &support_pwr_shield) &&
|
||||||
if (support_pwr_shield == 0xFF)
|
support_pwr_shield == 0xFF)
|
||||||
g_debug ("Power button shield feature not supported!\n");
|
g_debug ("Power button shield feature not supported!\n");
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_GET_VERSION:
|
case MOC_CMD0_GET_VERSION:
|
||||||
if (buffer_len < sizeof (gxfp_version_info_t) + 1)
|
const uint8_t *version_info;
|
||||||
return -1;
|
|
||||||
memcpy (&presp->version_info, buffer + 1, sizeof (gxfp_version_info_t));
|
if (!fpi_byte_reader_get_data (byte_reader, sizeof (gxfp_version_info_t), &version_info))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
memcpy (&presp->version_info, version_info, sizeof (gxfp_version_info_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_CAPTURE_DATA:
|
case MOC_CMD0_CAPTURE_DATA:
|
||||||
if (LOBYTE (cmd) == MOC_CMD1_DEFAULT)
|
if (LOBYTE (cmd) == MOC_CMD1_DEFAULT)
|
||||||
{
|
{
|
||||||
if (buffer_len < sizeof (gxfp_capturedata_t) + 1)
|
if (!fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
return -1;
|
&presp->capture_data_resp.img_quality))
|
||||||
presp->capture_data_resp.img_quality = buffer[1];
|
g_return_val_if_reached (-1);
|
||||||
presp->capture_data_resp.img_coverage = buffer[2];
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
|
&presp->capture_data_resp.img_coverage))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_ENROLL_INIT:
|
case MOC_CMD0_ENROLL_INIT:
|
||||||
if (buffer_len < sizeof (gxfp_enroll_create_t) + 1)
|
if (presp->result != GX_SUCCESS)
|
||||||
return -1;
|
break;
|
||||||
if (presp->result == GX_SUCCESS)
|
const uint8_t *tid;
|
||||||
memcpy (&presp->enroll_create.tid, &buffer[1], TEMPLATE_ID_SIZE);
|
if (!fpi_byte_reader_get_data (byte_reader, TEMPLATE_ID_SIZE, &tid))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
memcpy (presp->enroll_create.tid, tid, TEMPLATE_ID_SIZE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_ENROLL:
|
case MOC_CMD0_ENROLL:
|
||||||
if (buffer_len < sizeof (gxfp_enroll_update_t))
|
presp->enroll_update.rollback = (presp->result < 0x80) ? false : true;
|
||||||
return -1;
|
if (!fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
presp->enroll_update.rollback = (buffer[0] < 0x80) ? false : true;
|
&presp->enroll_update.img_overlay))
|
||||||
presp->enroll_update.img_overlay = buffer[1];
|
g_return_val_if_reached (-1);
|
||||||
presp->enroll_update.img_preoverlay = buffer[2];
|
|
||||||
|
if (!fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
|
&presp->enroll_update.img_preoverlay))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_CHECK4DUPLICATE:
|
case MOC_CMD0_CHECK4DUPLICATE:
|
||||||
presp->check_duplicate_resp.duplicate = (presp->result == 0) ? false : true;
|
presp->check_duplicate_resp.duplicate = (presp->result == 0) ? false : true;
|
||||||
if (presp->check_duplicate_resp.duplicate)
|
if (presp->check_duplicate_resp.duplicate)
|
||||||
{
|
{
|
||||||
if (buffer_len < 3)
|
uint16_t tid_size;
|
||||||
return -1;
|
FpiByteReader tid_reader;
|
||||||
uint16_t tid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + 1));
|
|
||||||
offset += 3;
|
|
||||||
|
|
||||||
if (buffer_len < tid_size + offset)
|
if (!fpi_byte_reader_get_uint16_le (byte_reader, &tid_size))
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
if (gx_proto_parse_fingerid (buffer + offset, tid_size, &presp->check_duplicate_resp.template) != 0)
|
|
||||||
return -1;
|
if (!fpi_byte_reader_get_sub_reader (byte_reader, &tid_reader, tid_size))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (gx_proto_parse_fingerid (&tid_reader, &presp->check_duplicate_resp.template) != 0)
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_GETFINGERLIST:
|
case MOC_CMD0_GETFINGERLIST:
|
||||||
if (presp->result != GX_SUCCESS)
|
if (presp->result != GX_SUCCESS)
|
||||||
break;
|
break;
|
||||||
if (buffer_len < 2)
|
|
||||||
return -1;
|
if (!fpi_byte_reader_get_uint8 (byte_reader,
|
||||||
presp->finger_list_resp.finger_num = buffer[1];
|
&presp->finger_list_resp.finger_num))
|
||||||
fingerlist = buffer + 2;
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
|
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
|
||||||
{
|
{
|
||||||
uint16_t fingerid_length;
|
uint16_t fingerid_length;
|
||||||
if (buffer_len < offset + 2)
|
FpiByteReader fingerid_reader;
|
||||||
return -1;
|
|
||||||
fingerid_length = GUINT16_FROM_LE (*(uint16_t *) (fingerlist + offset));
|
if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_length))
|
||||||
offset += 2;
|
g_return_val_if_reached (-1);
|
||||||
if (buffer_len < fingerid_length + offset)
|
|
||||||
return -1;
|
if (!fpi_byte_reader_get_sub_reader (byte_reader, &fingerid_reader,
|
||||||
if (gx_proto_parse_fingerid (fingerlist + offset,
|
fingerid_length))
|
||||||
fingerid_length,
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (gx_proto_parse_fingerid (&fingerid_reader,
|
||||||
&presp->finger_list_resp.finger_list[num]) != 0)
|
&presp->finger_list_resp.finger_list[num]) != 0)
|
||||||
{
|
{
|
||||||
g_warning ("Failed to parse finger list");
|
g_warning ("Failed to parse finger list");
|
||||||
return -1;
|
g_return_val_if_reached (-1);
|
||||||
}
|
}
|
||||||
offset += fingerid_length;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -405,23 +439,32 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
uint32_t score = 0;
|
uint32_t score = 0;
|
||||||
uint8_t study = 0;
|
uint8_t study = 0;
|
||||||
uint16_t fingerid_size = 0;
|
uint16_t fingerid_size = 0;
|
||||||
presp->verify.match = (buffer[0] == 0) ? true : false;
|
|
||||||
|
presp->verify.match = (presp->result == 0) ? true : false;
|
||||||
|
|
||||||
if (presp->verify.match)
|
if (presp->verify.match)
|
||||||
{
|
{
|
||||||
if (buffer_len < 10)
|
FpiByteReader finger_reader;
|
||||||
return -1;
|
|
||||||
offset += 1;
|
if (!fpi_byte_reader_get_uint16_le (byte_reader,
|
||||||
presp->verify.rejectdetail = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
&presp->verify.rejectdetail))
|
||||||
offset += 2;
|
g_return_val_if_reached (-1);
|
||||||
score = GUINT32_FROM_LE (*(uint32_t *) (buffer + offset));
|
|
||||||
offset += 4;
|
if (!fpi_byte_reader_get_uint32_le (byte_reader, &score))
|
||||||
study = buffer[offset];
|
g_return_val_if_reached (-1);
|
||||||
offset += 1;
|
|
||||||
fingerid_size = GUINT16_FROM_LE (*(uint16_t *) (buffer + offset));
|
if (!fpi_byte_reader_get_uint8 (byte_reader, &study))
|
||||||
offset += 2;
|
g_return_val_if_reached (-1);
|
||||||
if (buffer_len < fingerid_size + offset)
|
|
||||||
return -1;
|
if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_size))
|
||||||
if (gx_proto_parse_fingerid (buffer + offset, fingerid_size, &presp->verify.template) != 0)
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (!fpi_byte_reader_get_sub_reader (byte_reader, &finger_reader,
|
||||||
|
fingerid_size))
|
||||||
|
g_return_val_if_reached (-1);
|
||||||
|
|
||||||
|
if (gx_proto_parse_fingerid (&finger_reader,
|
||||||
|
&presp->verify.template) != 0)
|
||||||
{
|
{
|
||||||
presp->result = GX_FAILED;
|
presp->result = GX_FAILED;
|
||||||
break;
|
break;
|
||||||
@@ -432,7 +475,7 @@ gx_proto_parse_body (uint16_t cmd, uint8_t *buffer, uint16_t buffer_len, pgxfp_c
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MOC_CMD0_FINGER_MODE:
|
case MOC_CMD0_FINGER_MODE:
|
||||||
presp->finger_status.status = buffer[0];
|
presp->finger_status.status = presp->result;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fpi-byte-reader.h"
|
||||||
|
|
||||||
#define PACKAGE_CRC_SIZE (4)
|
#define PACKAGE_CRC_SIZE (4)
|
||||||
#define PACKAGE_HEADER_SIZE (8)
|
#define PACKAGE_HEADER_SIZE (8)
|
||||||
|
|
||||||
@@ -133,7 +135,7 @@ typedef struct _template_format
|
|||||||
typedef struct _gxfp_verify
|
typedef struct _gxfp_verify
|
||||||
{
|
{
|
||||||
bool match;
|
bool match;
|
||||||
uint32_t rejectdetail;
|
uint16_t rejectdetail;
|
||||||
template_format_t template;
|
template_format_t template;
|
||||||
} gxfp_verify_t, *pgxfp_verify_t;
|
} gxfp_verify_t, *pgxfp_verify_t;
|
||||||
|
|
||||||
@@ -232,13 +234,11 @@ int gx_proto_build_package (uint8_t *ppackage,
|
|||||||
const uint8_t *payload,
|
const uint8_t *payload,
|
||||||
uint32_t payload_size);
|
uint32_t payload_size);
|
||||||
|
|
||||||
int gx_proto_parse_header (uint8_t *buffer,
|
int gx_proto_parse_header (FpiByteReader *reader,
|
||||||
uint32_t buffer_len,
|
|
||||||
pack_header *pheader);
|
pack_header *pheader);
|
||||||
|
|
||||||
int gx_proto_parse_body (uint16_t cmd,
|
int gx_proto_parse_body (uint16_t cmd,
|
||||||
uint8_t *buffer,
|
FpiByteReader *byte_reader,
|
||||||
uint16_t buffer_len,
|
|
||||||
pgxfp_cmd_response_t presponse);
|
pgxfp_cmd_response_t presponse);
|
||||||
|
|
||||||
int gx_proto_init_sensor_config (pgxfp_sensor_cfg_t pconfig);
|
int gx_proto_init_sensor_config (pgxfp_sensor_cfg_t pconfig);
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ G_DEFINE_TYPE (FpiDeviceRealtek, fpi_device_realtek, FP_TYPE_DEVICE)
|
|||||||
|
|
||||||
static const FpIdEntry id_table[] = {
|
static const FpIdEntry id_table[] = {
|
||||||
{ .vid = 0x0bda, .pid = 0x5813, },
|
{ .vid = 0x0bda, .pid = 0x5813, },
|
||||||
|
{ .vid = 0x0bda, .pid = 0x5816, },
|
||||||
|
{ .vid = 0x2541, .pid = 0xfa03, },
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -92,6 +94,50 @@ fp_task_ssm_generic_cb (FpiDeviceRealtek *self,
|
|||||||
fpi_ssm_next_state (self->task_ssm);
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_get_device_info_cb (FpiDeviceRealtek *self,
|
||||||
|
uint8_t *buffer_in,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self->template_len = TEMPLATE_LEN_COMMON;
|
||||||
|
|
||||||
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_update_template_cb (FpiDeviceRealtek *self,
|
||||||
|
uint8_t *buffer_in,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_enroll_commit_cb (FpiDeviceRealtek *self,
|
||||||
|
uint8_t *buffer_in,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_ENROLL_NUM_STATES);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_finish_capture_cb (FpiDeviceRealtek *self,
|
fp_finish_capture_cb (FpiDeviceRealtek *self,
|
||||||
uint8_t *buffer_in,
|
uint8_t *buffer_in,
|
||||||
@@ -103,8 +149,17 @@ fp_finish_capture_cb (FpiDeviceRealtek *self,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
gint capture_status = buffer_in[0];
|
/* We hope this polling CMD can be completed before the action is cancelled */
|
||||||
|
GCancellable *cancellable = fpi_device_get_cancellable (FP_DEVICE (self));
|
||||||
|
if (g_cancellable_is_cancelled (cancellable))
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm,
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
|
"Action is cancelled!"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gint capture_status = buffer_in[0];
|
||||||
if (capture_status == 0)
|
if (capture_status == 0)
|
||||||
{
|
{
|
||||||
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
fpi_device_report_finger_status_changes (FP_DEVICE (self),
|
||||||
@@ -238,7 +293,6 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gint in_status = buffer_in[0];
|
gint in_status = buffer_in[0];
|
||||||
|
|
||||||
if (in_status == FP_RTK_CMD_ERR)
|
if (in_status == FP_RTK_CMD_ERR)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (self->task_ssm,
|
fpi_ssm_mark_failed (self->task_ssm,
|
||||||
@@ -291,7 +345,7 @@ fp_identify_feature_cb (FpiDeviceRealtek *self,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
fpi_device_identify_report (device, print, match, error);
|
fpi_device_identify_report (device, print, match, error);
|
||||||
fpi_ssm_mark_completed (self->task_ssm);
|
fpi_ssm_jump_to_state (self->task_ssm, FP_RTK_VERIFY_NUM_STATES);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -340,9 +394,9 @@ fp_get_delete_pos_cb (FpiDeviceRealtek *self,
|
|||||||
|
|
||||||
for (gint i = 0; i < self->template_num; i++)
|
for (gint i = 0; i < self->template_num; i++)
|
||||||
{
|
{
|
||||||
if (buffer_in[i * TEMPLATE_LEN] != 0)
|
if (buffer_in[i * self->template_len] != 0)
|
||||||
{
|
{
|
||||||
memcpy (temp_userid, buffer_in + i * TEMPLATE_LEN + UID_OFFSET, DEFAULT_UID_LEN);
|
memcpy (temp_userid, buffer_in + i * self->template_len + UID_OFFSET, DEFAULT_UID_LEN);
|
||||||
if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0)
|
if (g_strcmp0 (fp_print_get_description (print), (const char *) temp_userid) == 0)
|
||||||
{
|
{
|
||||||
self->pos_index = i;
|
self->pos_index = i;
|
||||||
@@ -380,10 +434,25 @@ fp_get_enroll_num_cb (FpiDeviceRealtek *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fp_get_template_cb (FpiDeviceRealtek *self,
|
fp_verify_get_template_cb (FpiDeviceRealtek *self,
|
||||||
uint8_t *buffer_in,
|
uint8_t *buffer_in,
|
||||||
GError *error)
|
GError *error)
|
||||||
{
|
{
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (self->task_ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_ssm_next_state (self->task_ssm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_enroll_get_template_cb (FpiDeviceRealtek *self,
|
||||||
|
uint8_t *buffer_in,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
g_autofree guchar *seq_list = NULL;
|
||||||
gboolean found = FALSE;
|
gboolean found = FALSE;
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
@@ -394,7 +463,7 @@ fp_get_template_cb (FpiDeviceRealtek *self,
|
|||||||
|
|
||||||
for (gint i = 0; i < self->template_num; i++)
|
for (gint i = 0; i < self->template_num; i++)
|
||||||
{
|
{
|
||||||
if (buffer_in[i * TEMPLATE_LEN] == 0)
|
if (buffer_in[i * self->template_len] == 0)
|
||||||
{
|
{
|
||||||
self->pos_index = i;
|
self->pos_index = i;
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
@@ -425,7 +494,6 @@ fp_check_duplicate_cb (FpiDeviceRealtek *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gint in_status = buffer_in[0];
|
gint in_status = buffer_in[0];
|
||||||
|
|
||||||
if (in_status == FP_RTK_CMD_ERR)
|
if (in_status == FP_RTK_CMD_ERR)
|
||||||
{
|
{
|
||||||
fpi_ssm_mark_failed (self->task_ssm,
|
fpi_ssm_mark_failed (self->task_ssm,
|
||||||
@@ -471,10 +539,10 @@ fp_list_cb (FpiDeviceRealtek *self,
|
|||||||
|
|
||||||
for (gint i = 0; i < self->template_num; i++)
|
for (gint i = 0; i < self->template_num; i++)
|
||||||
{
|
{
|
||||||
if (buffer_in[i * TEMPLATE_LEN] != 0)
|
if (buffer_in[i * self->template_len] != 0)
|
||||||
{
|
{
|
||||||
FpPrint *print = NULL;
|
FpPrint *print = NULL;
|
||||||
print = fp_print_from_data (self, buffer_in + i * TEMPLATE_LEN + SUBFACTOR_OFFSET);
|
print = fp_print_from_data (self, buffer_in + i * self->template_len + SUBFACTOR_OFFSET);
|
||||||
g_ptr_array_add (list_result, g_object_ref_sink (print));
|
g_ptr_array_add (list_result, g_object_ref_sink (print));
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
}
|
}
|
||||||
@@ -518,11 +586,11 @@ parse_status (guint8 *buffer, gint status_type)
|
|||||||
{
|
{
|
||||||
switch (status_type)
|
switch (status_type)
|
||||||
{
|
{
|
||||||
case FP_RTK_MSG_PLAINTEXT_NO_STATUS:
|
case FP_RTK_MSG_NO_STATUS:
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_MSG_PLAINTEXT:
|
case FP_RTK_MSG_DEFAULT:
|
||||||
return buffer[0];
|
return buffer[0];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -621,13 +689,13 @@ fp_cmd_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_CMD_TRANS_DATA:
|
case FP_RTK_CMD_TRANS_DATA:
|
||||||
if (self->cmd_type == FP_RTK_CMD_ONLY)
|
if (self->cmd_type == FP_RTK_CMD_BULK_ONLY)
|
||||||
{
|
{
|
||||||
fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS);
|
fpi_ssm_jump_to_state (ssm, FP_RTK_CMD_GET_STATUS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->cmd_type == FP_RTK_CMD_WRITE)
|
if (self->cmd_type == FP_RTK_CMD_BULK_WRITE)
|
||||||
{
|
{
|
||||||
if (self->data_transfer)
|
if (self->data_transfer)
|
||||||
{
|
{
|
||||||
@@ -688,7 +756,7 @@ fp_cmd_ssm_done (FpiSsm *ssm, FpDevice *dev, GError *error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static FpiUsbTransfer *
|
static FpiUsbTransfer *
|
||||||
prepare_transfer (FpDevice *dev,
|
prepare_bulk_transfer (FpDevice *dev,
|
||||||
guint8 *data,
|
guint8 *data,
|
||||||
gsize data_len,
|
gsize data_len,
|
||||||
GDestroyNotify free_func)
|
GDestroyNotify free_func)
|
||||||
@@ -708,8 +776,79 @@ prepare_transfer (FpDevice *dev,
|
|||||||
return g_steal_pointer (&transfer);
|
return g_steal_pointer (&transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
realtek_sensor_cmd (FpiDeviceRealtek *self,
|
fp_ctrl_cmd_cb (FpiUsbTransfer *transfer,
|
||||||
|
FpDevice *device,
|
||||||
|
gpointer user_data,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
|
||||||
|
g_autofree CommandData *data = g_steal_pointer (&user_data);
|
||||||
|
|
||||||
|
g_return_if_fail (data != NULL);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (transfer->ssm, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transfer->direction == G_USB_DEVICE_DIRECTION_HOST_TO_DEVICE)
|
||||||
|
{
|
||||||
|
if (data->callback)
|
||||||
|
data->callback (self, NULL, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (transfer->actual_length == 0)
|
||||||
|
{
|
||||||
|
fp_info ("Control transfer receive data failed!");
|
||||||
|
fpi_ssm_mark_failed (transfer->ssm,
|
||||||
|
fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->callback)
|
||||||
|
data->callback (self, transfer->buffer, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rtk_send_ctrl_cmd (FpiDeviceRealtek *self,
|
||||||
|
struct rtk_cmd_ctrl *ctrl_cmd,
|
||||||
|
guint8 *cmd_data,
|
||||||
|
SynCmdMsgCallback callback)
|
||||||
|
{
|
||||||
|
FpiUsbTransfer *transfer = NULL;
|
||||||
|
g_autofree CommandData *data = g_new0 (CommandData, 1);
|
||||||
|
|
||||||
|
data->callback = callback;
|
||||||
|
|
||||||
|
transfer = fpi_usb_transfer_new (FP_DEVICE (self));
|
||||||
|
fpi_usb_transfer_fill_control (transfer,
|
||||||
|
ctrl_cmd->direction,
|
||||||
|
G_USB_DEVICE_REQUEST_TYPE_VENDOR,
|
||||||
|
G_USB_DEVICE_RECIPIENT_DEVICE,
|
||||||
|
ctrl_cmd->request,
|
||||||
|
ctrl_cmd->value,
|
||||||
|
ctrl_cmd->index,
|
||||||
|
ctrl_cmd->len);
|
||||||
|
|
||||||
|
transfer->ssm = self->task_ssm;
|
||||||
|
if (ctrl_cmd->direction == G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST &&
|
||||||
|
cmd_data != NULL && ctrl_cmd->len != 0)
|
||||||
|
memcpy (transfer->buffer, cmd_data, ctrl_cmd->len);
|
||||||
|
|
||||||
|
fpi_usb_transfer_submit (transfer,
|
||||||
|
CMD_TIMEOUT,
|
||||||
|
NULL,
|
||||||
|
fp_ctrl_cmd_cb,
|
||||||
|
g_steal_pointer (&data));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rtk_sensor_bulk_cmd (FpiDeviceRealtek *self,
|
||||||
guint8 *cmd,
|
guint8 *cmd,
|
||||||
guint8 *trans_data,
|
guint8 *trans_data,
|
||||||
FpRtkMsgType message_type,
|
FpRtkMsgType message_type,
|
||||||
@@ -720,17 +859,17 @@ realtek_sensor_cmd (FpiDeviceRealtek *self,
|
|||||||
g_autoptr(FpiUsbTransfer) data_transfer = NULL;
|
g_autoptr(FpiUsbTransfer) data_transfer = NULL;
|
||||||
CommandData *data = g_new0 (CommandData, 1);
|
CommandData *data = g_new0 (CommandData, 1);
|
||||||
|
|
||||||
self->cmd_type = GET_CMD_TYPE (cmd[0]);
|
self->cmd_type = GET_BULK_CMD_TYPE (cmd[0]);
|
||||||
self->message_type = message_type;
|
self->message_type = message_type;
|
||||||
self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]);
|
self->trans_data_len = GET_TRANS_DATA_LEN (cmd[11], cmd[10]);
|
||||||
self->cmd_cancellable = bwait_data_delay;
|
self->cmd_cancellable = bwait_data_delay;
|
||||||
|
|
||||||
cmd_transfer = prepare_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_TOTAL_LEN, NULL);
|
cmd_transfer = prepare_bulk_transfer (FP_DEVICE (self), cmd, FP_RTK_CMD_BULK_TOTAL_LEN, NULL);
|
||||||
self->cmd_transfer = g_steal_pointer (&cmd_transfer);
|
self->cmd_transfer = g_steal_pointer (&cmd_transfer);
|
||||||
|
|
||||||
if ((self->cmd_type == FP_RTK_CMD_WRITE) && trans_data)
|
if ((self->cmd_type == FP_RTK_CMD_BULK_WRITE) && trans_data)
|
||||||
{
|
{
|
||||||
data_transfer = prepare_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free);
|
data_transfer = prepare_bulk_transfer (FP_DEVICE (self), trans_data, self->trans_data_len, g_free);
|
||||||
self->data_transfer = g_steal_pointer (&data_transfer);
|
self->data_transfer = g_steal_pointer (&data_transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -829,34 +968,49 @@ fp_verify_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
|
case FP_RTK_VERIFY_GET_TEMPLATE:
|
||||||
|
g_assert (self->template_num > 0);
|
||||||
|
|
||||||
|
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
|
||||||
|
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
|
||||||
|
cmd_buf = (guint8 *) &co_get_template;
|
||||||
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_verify_get_template_cb);
|
||||||
|
break;
|
||||||
|
|
||||||
case FP_RTK_VERIFY_CAPTURE:
|
case FP_RTK_VERIFY_CAPTURE:
|
||||||
fpi_device_report_finger_status_changes (device,
|
fpi_device_report_finger_status_changes (device,
|
||||||
FP_FINGER_STATUS_NEEDED,
|
FP_FINGER_STATUS_NEEDED,
|
||||||
FP_FINGER_STATUS_NONE);
|
FP_FINGER_STATUS_NONE);
|
||||||
|
|
||||||
cmd_buf = (guint8 *) &co_start_capture;
|
cmd_buf = (guint8 *) &co_start_capture;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_VERIFY_FINISH_CAPTURE:
|
case FP_RTK_VERIFY_FINISH_CAPTURE:
|
||||||
cmd_buf = (guint8 *) &co_finish_capture;
|
cmd_buf = (guint8 *) &co_finish_capture;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_VERIFY_ACCEPT_SAMPLE:
|
case FP_RTK_VERIFY_ACCEPT_SAMPLE:
|
||||||
co_accept_sample.param[0] = self->fp_purpose;
|
co_accept_sample.param[0] = self->fp_purpose;
|
||||||
cmd_buf = (guint8 *) &co_accept_sample;
|
cmd_buf = (guint8 *) &co_accept_sample;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_VERIFY_INDENTIFY_FEATURE:
|
case FP_RTK_VERIFY_INDENTIFY_FEATURE:
|
||||||
cmd_buf = (guint8 *) &tls_identify_feature;
|
cmd_buf = (guint8 *) &nor_identify_feature;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 0, fp_identify_feature_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_identify_feature_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_VERIFY_UPDATE_TEMPLATE:
|
case FP_RTK_VERIFY_UPDATE_TEMPLATE:
|
||||||
cmd_buf = (guint8 *) &co_update_template;
|
cmd_buf = (guint8 *) &co_update_template;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_update_template_cb);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FP_RTK_VERIFY_CANCEL_CAPTURE:
|
||||||
|
co_cancel_capture.param[0] = self->fp_purpose;
|
||||||
|
cmd_buf = (guint8 *) &co_cancel_capture;
|
||||||
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -869,7 +1023,6 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
|
FpiDeviceRealtek *self = FPI_DEVICE_REALTEK (device);
|
||||||
FpPrint *print = NULL;
|
FpPrint *print = NULL;
|
||||||
guint8 *cmd_buf = NULL;
|
guint8 *cmd_buf = NULL;
|
||||||
guint8 *trans_id = NULL;
|
|
||||||
GVariant *uid = NULL;
|
GVariant *uid = NULL;
|
||||||
GVariant *data = NULL;
|
GVariant *data = NULL;
|
||||||
gsize user_id_len;
|
gsize user_id_len;
|
||||||
@@ -880,17 +1033,17 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
case FP_RTK_ENROLL_GET_TEMPLATE:
|
case FP_RTK_ENROLL_GET_TEMPLATE:
|
||||||
g_assert (self->template_num > 0);
|
g_assert (self->template_num > 0);
|
||||||
|
|
||||||
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
|
||||||
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
|
||||||
|
|
||||||
cmd_buf = (guint8 *) &co_get_template;
|
cmd_buf = (guint8 *) &co_get_template;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_template_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_enroll_get_template_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_BEGIN_POS:
|
case FP_RTK_ENROLL_BEGIN_POS:
|
||||||
tls_enroll_begin.param[0] = self->pos_index;
|
nor_enroll_begin.param[0] = self->pos_index;
|
||||||
cmd_buf = (guint8 *) &tls_enroll_begin;
|
cmd_buf = (guint8 *) &nor_enroll_begin;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_CAPTURE:
|
case FP_RTK_ENROLL_CAPTURE:
|
||||||
@@ -899,39 +1052,42 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
FP_FINGER_STATUS_NONE);
|
FP_FINGER_STATUS_NONE);
|
||||||
|
|
||||||
cmd_buf = (guint8 *) &co_start_capture;
|
cmd_buf = (guint8 *) &co_start_capture;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_FINISH_CAPTURE:
|
case FP_RTK_ENROLL_FINISH_CAPTURE:
|
||||||
cmd_buf = (guint8 *) &co_finish_capture;
|
cmd_buf = (guint8 *) &co_finish_capture;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_finish_capture_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_finish_capture_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_ACCEPT_SAMPLE:
|
case FP_RTK_ENROLL_ACCEPT_SAMPLE:
|
||||||
co_accept_sample.param[0] = self->fp_purpose;
|
co_accept_sample.param[0] = self->fp_purpose;
|
||||||
cmd_buf = (guint8 *) &co_accept_sample;
|
cmd_buf = (guint8 *) &co_accept_sample;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_accept_sample_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_accept_sample_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_CHECK_DUPLICATE:
|
case FP_RTK_ENROLL_CHECK_DUPLICATE:
|
||||||
cmd_buf = (guint8 *) &co_check_duplicate;
|
cmd_buf = (guint8 *) &co_check_duplicate;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT_NO_STATUS, 1, fp_check_duplicate_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_NO_STATUS, 0, fp_check_duplicate_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_ENROLL_COMMIT:
|
case FP_RTK_ENROLL_COMMIT:
|
||||||
|
gchar *valid_uid = NULL;
|
||||||
|
gint payload_len;
|
||||||
|
|
||||||
|
payload_len = UID_PAYLOAD_LEN_DEFAULT;
|
||||||
|
|
||||||
fpi_device_get_enroll_data (device, &print);
|
fpi_device_get_enroll_data (device, &print);
|
||||||
user_id = fpi_print_generate_user_id (print);
|
user_id = fpi_print_generate_user_id (print);
|
||||||
user_id_len = strlen (user_id);
|
user_id_len = MIN (DEFAULT_UID_LEN, strlen (user_id));
|
||||||
user_id_len = MIN (DEFAULT_UID_LEN, user_id_len);
|
|
||||||
|
|
||||||
payload = g_malloc0 (UID_PAYLOAD_LEN);
|
payload = g_malloc0 (payload_len);
|
||||||
memcpy (payload, user_id, user_id_len);
|
memcpy (payload, user_id, user_id_len);
|
||||||
|
valid_uid = (gchar *) payload;
|
||||||
trans_id = g_steal_pointer (&payload);
|
|
||||||
|
|
||||||
finger = SUB_FINGER_01;
|
finger = SUB_FINGER_01;
|
||||||
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
uid = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
||||||
user_id,
|
valid_uid,
|
||||||
user_id_len,
|
user_id_len,
|
||||||
1);
|
1);
|
||||||
data = g_variant_new ("(y@ay)",
|
data = g_variant_new ("(y@ay)",
|
||||||
@@ -941,14 +1097,23 @@ fp_enroll_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
fpi_print_set_type (print, FPI_PRINT_RAW);
|
fpi_print_set_type (print, FPI_PRINT_RAW);
|
||||||
fpi_print_set_device_stored (print, TRUE);
|
fpi_print_set_device_stored (print, TRUE);
|
||||||
g_object_set (print, "fpi-data", data, NULL);
|
g_object_set (print, "fpi-data", data, NULL);
|
||||||
g_object_set (print, "description", user_id, NULL);
|
g_object_set (print, "description", valid_uid, NULL);
|
||||||
|
|
||||||
g_debug ("user_id: %s, finger: 0x%x", user_id, finger);
|
g_debug ("user_id: %s, finger: 0x%x", user_id, finger);
|
||||||
|
|
||||||
tls_enroll_commit.param[0] = SUB_FINGER_01;
|
nor_enroll_commit.param[0] = SUB_FINGER_01;
|
||||||
cmd_buf = (guint8 *) &tls_enroll_commit;
|
nor_enroll_commit.data_len[0] = GET_LEN_L (payload_len);
|
||||||
realtek_sensor_cmd (self, cmd_buf, trans_id, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
|
nor_enroll_commit.data_len[1] = GET_LEN_H (payload_len);
|
||||||
|
|
||||||
|
cmd_buf = (guint8 *) &nor_enroll_commit;
|
||||||
|
rtk_sensor_bulk_cmd (self, cmd_buf, g_steal_pointer (&payload),
|
||||||
|
FP_RTK_MSG_DEFAULT, 1, fp_enroll_commit_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FP_RTK_ENROLL_CANCEL_CAPTURE:
|
||||||
|
co_cancel_capture.param[0] = self->fp_purpose;
|
||||||
|
cmd_buf = (guint8 *) &co_cancel_capture;
|
||||||
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -960,15 +1125,19 @@ fp_init_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
|
|
||||||
switch (fpi_ssm_get_cur_state (ssm))
|
switch (fpi_ssm_get_cur_state (ssm))
|
||||||
{
|
{
|
||||||
|
case FP_RTK_INIT_GET_DEVICE_INFO:
|
||||||
|
rtk_send_ctrl_cmd (self, &get_device_info, NULL, fp_get_device_info_cb);
|
||||||
|
break;
|
||||||
|
|
||||||
case FP_RTK_INIT_SELECT_OS:
|
case FP_RTK_INIT_SELECT_OS:
|
||||||
co_select_system.param[0] = 0x01;
|
co_select_system.param[0] = 0x01;
|
||||||
cmd_buf = (guint8 *) &co_select_system;
|
cmd_buf = (guint8 *) &co_select_system;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_INIT_GET_ENROLL_NUM:
|
case FP_RTK_INIT_GET_ENROLL_NUM:
|
||||||
cmd_buf = (guint8 *) &co_get_enroll_num;
|
cmd_buf = (guint8 *) &co_get_enroll_num;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_enroll_num_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_enroll_num_cb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -984,17 +1153,17 @@ fp_delete_sm_run_state (FpiSsm *ssm, FpDevice *device)
|
|||||||
case FP_RTK_DELETE_GET_POS:
|
case FP_RTK_DELETE_GET_POS:
|
||||||
g_assert (self->template_num > 0);
|
g_assert (self->template_num > 0);
|
||||||
|
|
||||||
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
|
||||||
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
|
||||||
|
|
||||||
cmd_buf = (guint8 *) &co_get_template;
|
cmd_buf = (guint8 *) &co_get_template;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_get_delete_pos_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_get_delete_pos_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FP_RTK_DELETE_PRINT:
|
case FP_RTK_DELETE_PRINT:
|
||||||
co_delete_record.param[0] = self->pos_index;
|
co_delete_record.param[0] = self->pos_index;
|
||||||
cmd_buf = (guint8 *) &co_delete_record;
|
cmd_buf = (guint8 *) &co_delete_record;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_task_ssm_generic_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_task_ssm_generic_cb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1012,17 +1181,14 @@ identify_verify (FpDevice *device)
|
|||||||
g_assert (current_action == FPI_DEVICE_ACTION_VERIFY ||
|
g_assert (current_action == FPI_DEVICE_ACTION_VERIFY ||
|
||||||
current_action == FPI_DEVICE_ACTION_IDENTIFY);
|
current_action == FPI_DEVICE_ACTION_IDENTIFY);
|
||||||
|
|
||||||
if (current_action == FPI_DEVICE_ACTION_IDENTIFY)
|
|
||||||
self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
|
self->fp_purpose = FP_RTK_PURPOSE_IDENTIFY;
|
||||||
else
|
|
||||||
self->fp_purpose = FP_RTK_PURPOSE_VERIFY;
|
|
||||||
|
|
||||||
g_assert (!self->task_ssm);
|
g_assert (!self->task_ssm);
|
||||||
|
|
||||||
self->task_ssm = fpi_ssm_new_full (device,
|
self->task_ssm = fpi_ssm_new_full (device,
|
||||||
fp_verify_sm_run_state,
|
fp_verify_sm_run_state,
|
||||||
FP_RTK_VERIFY_NUM_STATES,
|
FP_RTK_VERIFY_NUM_STATES,
|
||||||
FP_RTK_VERIFY_NUM_STATES,
|
FP_RTK_VERIFY_CANCEL_CAPTURE,
|
||||||
"Verify & Identify");
|
"Verify & Identify");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
|
fpi_ssm_start (self->task_ssm, fp_verify_ssm_done);
|
||||||
@@ -1042,7 +1208,7 @@ enroll (FpDevice *device)
|
|||||||
self->task_ssm = fpi_ssm_new_full (device,
|
self->task_ssm = fpi_ssm_new_full (device,
|
||||||
fp_enroll_sm_run_state,
|
fp_enroll_sm_run_state,
|
||||||
FP_RTK_ENROLL_NUM_STATES,
|
FP_RTK_ENROLL_NUM_STATES,
|
||||||
FP_RTK_ENROLL_NUM_STATES,
|
FP_RTK_ENROLL_CANCEL_CAPTURE,
|
||||||
"Enroll");
|
"Enroll");
|
||||||
|
|
||||||
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
|
fpi_ssm_start (self->task_ssm, fp_enroll_ssm_done);
|
||||||
@@ -1167,7 +1333,7 @@ clear_storage (FpDevice *device)
|
|||||||
G_DEBUG_HERE ();
|
G_DEBUG_HERE ();
|
||||||
co_delete_record.param[0] = 0xff;
|
co_delete_record.param[0] = 0xff;
|
||||||
cmd_buf = (guint8 *) &co_delete_record;
|
cmd_buf = (guint8 *) &co_delete_record;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 0, fp_clear_storage_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 0, fp_clear_storage_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1179,11 +1345,11 @@ list_print (FpDevice *device)
|
|||||||
G_DEBUG_HERE ();
|
G_DEBUG_HERE ();
|
||||||
g_assert (self->template_num > 0);
|
g_assert (self->template_num > 0);
|
||||||
|
|
||||||
co_get_template.data_len[0] = GET_LEN_L (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[0] = GET_LEN_L (self->template_len * self->template_num);
|
||||||
co_get_template.data_len[1] = GET_LEN_H (TEMPLATE_LEN * self->template_num);
|
co_get_template.data_len[1] = GET_LEN_H (self->template_len * self->template_num);
|
||||||
|
|
||||||
cmd_buf = (guint8 *) &co_get_template;
|
cmd_buf = (guint8 *) &co_get_template;
|
||||||
realtek_sensor_cmd (self, cmd_buf, NULL, FP_RTK_MSG_PLAINTEXT, 1, fp_list_cb);
|
rtk_sensor_bulk_cmd (self, cmd_buf, NULL, FP_RTK_MSG_DEFAULT, 1, fp_list_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -30,16 +30,17 @@
|
|||||||
|
|
||||||
#define EP_IN_MAX_BUF_SIZE 2048
|
#define EP_IN_MAX_BUF_SIZE 2048
|
||||||
|
|
||||||
#define FP_RTK_CMD_TOTAL_LEN 12
|
#define FP_RTK_CMD_BULK_TOTAL_LEN 12
|
||||||
#define FP_RTK_CMD_LEN 2
|
#define FP_RTK_CMD_BULK_LEN 2
|
||||||
#define FP_RTK_CMD_PARAM_LEN 4
|
#define FP_RTK_CMD_BULK_PARAM_LEN 4
|
||||||
#define FP_RTK_CMD_ADDR_LEN 4
|
#define FP_RTK_CMD_BULK_ADDR_LEN 4
|
||||||
#define FP_RTK_CMD_DATA_LEN 2
|
#define FP_RTK_CMD_BULK_DATA_LEN 2
|
||||||
|
|
||||||
|
#define TEMPLATE_LEN_COMMON 35
|
||||||
|
|
||||||
#define TEMPLATE_LEN 35
|
|
||||||
#define SUBFACTOR_OFFSET 2
|
#define SUBFACTOR_OFFSET 2
|
||||||
#define UID_OFFSET 3
|
#define UID_OFFSET 3
|
||||||
#define UID_PAYLOAD_LEN 32
|
#define UID_PAYLOAD_LEN_DEFAULT 32
|
||||||
|
|
||||||
/* Command transfer timeout :ms*/
|
/* Command transfer timeout :ms*/
|
||||||
#define CMD_TIMEOUT 1000
|
#define CMD_TIMEOUT 1000
|
||||||
@@ -50,7 +51,7 @@
|
|||||||
#define DEFAULT_UID_LEN 28
|
#define DEFAULT_UID_LEN 28
|
||||||
#define SUB_FINGER_01 0xFF
|
#define SUB_FINGER_01 0xFF
|
||||||
|
|
||||||
#define GET_CMD_TYPE(val) ((val & 0xC0) >> 6)
|
#define GET_BULK_CMD_TYPE(val) ((val & 0xC0) >> 6)
|
||||||
#define GET_TRANS_DATA_LEN(len_h, len_l) ((len_h << 8) | len_l)
|
#define GET_TRANS_DATA_LEN(len_h, len_l) ((len_h << 8) | len_l)
|
||||||
#define GET_LEN_L(total_data_len) ((total_data_len) & 0xff)
|
#define GET_LEN_L(total_data_len) ((total_data_len) & 0xff)
|
||||||
#define GET_LEN_H(total_data_len) ((total_data_len) >> 8)
|
#define GET_LEN_H(total_data_len) ((total_data_len) >> 8)
|
||||||
@@ -67,19 +68,19 @@ typedef struct
|
|||||||
} CommandData;
|
} CommandData;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_RTK_CMD_ONLY = 0,
|
FP_RTK_CMD_BULK_ONLY = 0,
|
||||||
FP_RTK_CMD_READ,
|
FP_RTK_CMD_BULK_READ,
|
||||||
FP_RTK_CMD_WRITE,
|
FP_RTK_CMD_BULK_WRITE,
|
||||||
} FpRtkCmdType;
|
} FpRtkCmdType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_RTK_MSG_PLAINTEXT = 0,
|
FP_RTK_MSG_DEFAULT = 0,
|
||||||
FP_RTK_MSG_PLAINTEXT_NO_STATUS,
|
FP_RTK_MSG_NO_STATUS,
|
||||||
} FpRtkMsgType;
|
} FpRtkMsgType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_RTK_PURPOSE_IDENTIFY = 0x01, /* identify before enroll */
|
FP_RTK_PURPOSE_VERIFY = 0x01,
|
||||||
FP_RTK_PURPOSE_VERIFY = 0x02,
|
FP_RTK_PURPOSE_IDENTIFY = 0x02,
|
||||||
FP_RTK_PURPOSE_ENROLL = 0x04,
|
FP_RTK_PURPOSE_ENROLL = 0x04,
|
||||||
} FpRtkPurpose;
|
} FpRtkPurpose;
|
||||||
|
|
||||||
@@ -107,15 +108,18 @@ typedef enum {
|
|||||||
FP_RTK_ENROLL_ACCEPT_SAMPLE,
|
FP_RTK_ENROLL_ACCEPT_SAMPLE,
|
||||||
FP_RTK_ENROLL_CHECK_DUPLICATE,
|
FP_RTK_ENROLL_CHECK_DUPLICATE,
|
||||||
FP_RTK_ENROLL_COMMIT,
|
FP_RTK_ENROLL_COMMIT,
|
||||||
|
FP_RTK_ENROLL_CANCEL_CAPTURE,
|
||||||
FP_RTK_ENROLL_NUM_STATES,
|
FP_RTK_ENROLL_NUM_STATES,
|
||||||
} FpRtkEnrollState;
|
} FpRtkEnrollState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_RTK_VERIFY_CAPTURE = 0,
|
FP_RTK_VERIFY_GET_TEMPLATE = 0,
|
||||||
|
FP_RTK_VERIFY_CAPTURE,
|
||||||
FP_RTK_VERIFY_FINISH_CAPTURE,
|
FP_RTK_VERIFY_FINISH_CAPTURE,
|
||||||
FP_RTK_VERIFY_ACCEPT_SAMPLE,
|
FP_RTK_VERIFY_ACCEPT_SAMPLE,
|
||||||
FP_RTK_VERIFY_INDENTIFY_FEATURE,
|
FP_RTK_VERIFY_INDENTIFY_FEATURE,
|
||||||
FP_RTK_VERIFY_UPDATE_TEMPLATE,
|
FP_RTK_VERIFY_UPDATE_TEMPLATE,
|
||||||
|
FP_RTK_VERIFY_CANCEL_CAPTURE,
|
||||||
FP_RTK_VERIFY_NUM_STATES,
|
FP_RTK_VERIFY_NUM_STATES,
|
||||||
} FpRtkVerifyState;
|
} FpRtkVerifyState;
|
||||||
|
|
||||||
@@ -126,7 +130,8 @@ typedef enum {
|
|||||||
} FpRtkDeleteState;
|
} FpRtkDeleteState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_RTK_INIT_SELECT_OS = 0,
|
FP_RTK_INIT_GET_DEVICE_INFO = 0,
|
||||||
|
FP_RTK_INIT_SELECT_OS,
|
||||||
FP_RTK_INIT_GET_ENROLL_NUM,
|
FP_RTK_INIT_GET_ENROLL_NUM,
|
||||||
FP_RTK_INIT_NUM_STATES,
|
FP_RTK_INIT_NUM_STATES,
|
||||||
} FpRtkInitState;
|
} FpRtkInitState;
|
||||||
@@ -155,66 +160,87 @@ struct _FpiDeviceRealtek
|
|||||||
FpRtkPurpose fp_purpose;
|
FpRtkPurpose fp_purpose;
|
||||||
gint pos_index;
|
gint pos_index;
|
||||||
gint template_num;
|
gint template_num;
|
||||||
|
gint template_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct realtek_fp_cmd
|
struct rtk_cmd_bulk
|
||||||
{
|
{
|
||||||
uint8_t cmd[FP_RTK_CMD_LEN];
|
uint8_t cmd[FP_RTK_CMD_BULK_LEN];
|
||||||
uint8_t param[FP_RTK_CMD_PARAM_LEN];
|
uint8_t param[FP_RTK_CMD_BULK_PARAM_LEN];
|
||||||
uint8_t addr[FP_RTK_CMD_ADDR_LEN];
|
uint8_t addr[FP_RTK_CMD_BULK_ADDR_LEN];
|
||||||
uint8_t data_len[FP_RTK_CMD_DATA_LEN];
|
uint8_t data_len[FP_RTK_CMD_BULK_DATA_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_start_capture = {
|
struct rtk_cmd_ctrl
|
||||||
|
{
|
||||||
|
int direction;
|
||||||
|
uint8_t request;
|
||||||
|
uint16_t value;
|
||||||
|
uint16_t index;
|
||||||
|
uint16_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct rtk_cmd_ctrl get_device_info = {
|
||||||
|
.direction = G_USB_DEVICE_DIRECTION_DEVICE_TO_HOST,
|
||||||
|
.request = 0x07,
|
||||||
|
.value = 0x000D,
|
||||||
|
.index = 0x0000,
|
||||||
|
.len = 0x0008,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct rtk_cmd_bulk co_start_capture = {
|
||||||
.cmd = {0x05, 0x05},
|
.cmd = {0x05, 0x05},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_finish_capture = {
|
static struct rtk_cmd_bulk co_finish_capture = {
|
||||||
.cmd = {0x45, 0x06},
|
.cmd = {0x45, 0x06},
|
||||||
.data_len = {0x05},
|
.data_len = {0x05},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_accept_sample = {
|
static struct rtk_cmd_bulk co_accept_sample = {
|
||||||
.cmd = {0x45, 0x08},
|
.cmd = {0x45, 0x08},
|
||||||
.data_len = {0x09},
|
.data_len = {0x09},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd tls_identify_feature = {
|
static struct rtk_cmd_bulk nor_identify_feature = {
|
||||||
.cmd = {0x45, 0x22},
|
.cmd = {0x45, 0x22},
|
||||||
.data_len = {0x2A},
|
.data_len = {0x2A},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_get_enroll_num = {
|
static struct rtk_cmd_bulk co_get_enroll_num = {
|
||||||
.cmd = {0x45, 0x0d},
|
.cmd = {0x45, 0x0d},
|
||||||
.data_len = {0x02},
|
.data_len = {0x02},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_get_template = {
|
static struct rtk_cmd_bulk co_get_template = {
|
||||||
.cmd = {0x45, 0x0E},
|
.cmd = {0x45, 0x0E},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd tls_enroll_begin = {
|
static struct rtk_cmd_bulk nor_enroll_begin = {
|
||||||
.cmd = {0x05, 0x20},
|
.cmd = {0x05, 0x20},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_check_duplicate = {
|
static struct rtk_cmd_bulk co_check_duplicate = {
|
||||||
.cmd = {0x45, 0x10},
|
.cmd = {0x45, 0x10},
|
||||||
.data_len = {0x22},
|
.data_len = {0x22},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd tls_enroll_commit = {
|
static struct rtk_cmd_bulk nor_enroll_commit = {
|
||||||
.cmd = {0x85, 0x21},
|
.cmd = {0x85, 0x21},
|
||||||
.data_len = {0x20},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_update_template = {
|
static struct rtk_cmd_bulk co_update_template = {
|
||||||
.cmd = {0x05, 0x11},
|
.cmd = {0x05, 0x11},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_delete_record = {
|
static struct rtk_cmd_bulk co_delete_record = {
|
||||||
.cmd = {0x05, 0x0F},
|
.cmd = {0x05, 0x0F},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct realtek_fp_cmd co_select_system = {
|
static struct rtk_cmd_bulk co_select_system = {
|
||||||
.cmd = {0x05, 0x13},
|
.cmd = {0x05, 0x13},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct rtk_cmd_bulk co_cancel_capture = {
|
||||||
|
.cmd = {0x05, 0x07},
|
||||||
|
};
|
||||||
@@ -256,6 +256,7 @@ bmkt_compose_message (uint8_t *cmd, int *cmd_len, uint8_t msg_id, uint8_t seq_nu
|
|||||||
cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num;
|
cmd[BMKT_MESSAGE_SEQ_NUM_FIELD] = seq_num;
|
||||||
cmd[BMKT_MESSAGE_ID_FIELD] = msg_id;
|
cmd[BMKT_MESSAGE_ID_FIELD] = msg_id;
|
||||||
cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size;
|
cmd[BMKT_MESSAGE_PAYLOAD_LEN_FIELD] = payload_size;
|
||||||
|
if (payload_size > 0)
|
||||||
memcpy (&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size);
|
memcpy (&cmd[BMKT_MESSAGE_PAYLOAD_FIELD], payload, payload_size);
|
||||||
|
|
||||||
*cmd_len = message_len;
|
*cmd_len = message_len;
|
||||||
|
|||||||
@@ -32,22 +32,35 @@ static void compose_and_send_identify_msg (FpDevice *device);
|
|||||||
|
|
||||||
static const FpIdEntry id_table[] = {
|
static const FpIdEntry id_table[] = {
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00BD, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00BD, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C4, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C6, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00DF, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00DF, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00E9, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F9, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00FC, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00C2, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0100, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x00F0, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0103, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0107, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0108, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0109, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x010A, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0123, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0124, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0126, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0129, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
|
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x015F, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0104, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0168, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0169, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x016C, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0173, },
|
||||||
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0106, },
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x0174, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019D, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x019F, },
|
||||||
|
{ .vid = SYNAPTICS_VENDOR_ID, .pid = 0x01A0, },
|
||||||
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
{ .vid = 0, .pid = 0, .driver_data = 0 }, /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1247,6 +1260,12 @@ dev_probe (FpDevice *device)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!g_usb_device_reset (usb_dev, &error))
|
||||||
|
{
|
||||||
|
fp_dbg ("%s g_usb_device_reset failed %s", G_STRFUNC, error->message);
|
||||||
|
goto err_close;
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error))
|
if (!g_usb_device_claim_interface (usb_dev, 0, 0, &error))
|
||||||
goto err_close;
|
goto err_close;
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,8 @@ struct read_msg_data
|
|||||||
static void __read_msg_async (FpDevice *dev,
|
static void __read_msg_async (FpDevice *dev,
|
||||||
struct read_msg_data *udata);
|
struct read_msg_data *udata);
|
||||||
|
|
||||||
#define READ_MSG_DATA_CB_ERR(dev, udata, error) (udata)->callback (dev, \
|
#define READ_MSG_DATA_CB_ERR(dev, udata, error) \
|
||||||
|
(udata)->callback (dev, \
|
||||||
READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error)
|
READ_MSG_CMD, 0, 0, NULL, 0, (udata)->user_data, error)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1243,7 +1244,7 @@ do_verify_stop (FpDevice *dev, FpiMatchResult res, GError *error)
|
|||||||
FpiSsm *ssm = deinitsm_new (dev, data);
|
FpiSsm *ssm = deinitsm_new (dev, data);
|
||||||
|
|
||||||
/* Report the error immediately if possible, otherwise delay it. */
|
/* Report the error immediately if possible, otherwise delay it. */
|
||||||
if (error && error->domain == FP_DEVICE_RETRY)
|
if (!error || error->domain == FP_DEVICE_RETRY)
|
||||||
fpi_device_verify_report (dev, res, NULL, error);
|
fpi_device_verify_report (dev, res, NULL, error);
|
||||||
else
|
else
|
||||||
data->error = error;
|
data->error = error;
|
||||||
@@ -1295,7 +1296,7 @@ verify_start_sm_run_state (FpiSsm *ssm, FpDevice *dev)
|
|||||||
memcpy (msg, verify_hdr, sizeof (verify_hdr));
|
memcpy (msg, verify_hdr, sizeof (verify_hdr));
|
||||||
memcpy (msg + sizeof (verify_hdr), data, data_len);
|
memcpy (msg + sizeof (verify_hdr), data, data_len);
|
||||||
|
|
||||||
transfer = alloc_send_cmd28_transfer (dev, 0x03, data, data_len);
|
transfer = alloc_send_cmd28_transfer (dev, 0x03, msg, msg_len);
|
||||||
|
|
||||||
g_free (msg);
|
g_free (msg);
|
||||||
|
|
||||||
@@ -1341,7 +1342,6 @@ v_handle_resp00 (FpDevice *dev, unsigned char *data,
|
|||||||
fp_dbg ("good image");
|
fp_dbg ("good image");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1c: /* FIXME what does this one mean? */
|
|
||||||
case 0x0b: /* FIXME what does this one mean? */
|
case 0x0b: /* FIXME what does this one mean? */
|
||||||
case 0x23: /* FIXME what does this one mean? */
|
case 0x23: /* FIXME what does this one mean? */
|
||||||
error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL);
|
error = fpi_device_retry_new (FP_DEVICE_RETRY_GENERAL);
|
||||||
@@ -1351,6 +1351,14 @@ v_handle_resp00 (FpDevice *dev, unsigned char *data,
|
|||||||
error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER);
|
error = fpi_device_retry_new (FP_DEVICE_RETRY_REMOVE_FINGER);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x1c: /* swipe too fast */
|
||||||
|
error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_FAST);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x1d: /* too much horizontal movement */
|
||||||
|
error = fpi_device_retry_new (FP_DEVICE_RETRY_CENTER_FINGER);
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x1e: /* swipe too short */
|
case 0x1e: /* swipe too short */
|
||||||
error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT);
|
error = fpi_device_retry_new (FP_DEVICE_RETRY_TOO_SHORT);
|
||||||
break;
|
break;
|
||||||
@@ -1439,7 +1447,7 @@ verify_rd2800_cb (FpDevice *dev, enum read_msg_type msgtype,
|
|||||||
do_verify_stop (dev,
|
do_verify_stop (dev,
|
||||||
FPI_MATCH_ERROR,
|
FPI_MATCH_ERROR,
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
"Response hat wrong command sequence"));
|
"Response had wrong command sequence"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+59
-65
@@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
#define FP_COMPONENT "uru4000"
|
#define FP_COMPONENT "uru4000"
|
||||||
|
|
||||||
#include <nss.h>
|
#include <openssl/evp.h>
|
||||||
#include <pk11pub.h>
|
#include <openssl/err.h>
|
||||||
|
|
||||||
#include "drivers_api.h"
|
#include "drivers_api.h"
|
||||||
|
|
||||||
@@ -148,10 +148,7 @@ struct _FpiDeviceUru4000
|
|||||||
int fwfixer_offset;
|
int fwfixer_offset;
|
||||||
unsigned char fwfixer_value;
|
unsigned char fwfixer_value;
|
||||||
|
|
||||||
CK_MECHANISM_TYPE cipher;
|
EVP_CIPHER_CTX *cipher_ctx;
|
||||||
PK11SlotInfo *slot;
|
|
||||||
PK11SymKey *symkey;
|
|
||||||
SECItem *param;
|
|
||||||
};
|
};
|
||||||
G_DECLARE_FINAL_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000,
|
G_DECLARE_FINAL_TYPE (FpiDeviceUru4000, fpi_device_uru4000, FPI, DEVICE_URU4000,
|
||||||
FpImageDevice);
|
FpImageDevice);
|
||||||
@@ -246,13 +243,29 @@ response_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *e
|
|||||||
fpi_ssm_mark_failed (ssm, error);
|
fpi_ssm_mark_failed (ssm, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GError *
|
||||||
|
openssl_device_error (void)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
unsigned long e;
|
||||||
|
|
||||||
|
e = ERR_get_error ();
|
||||||
|
if (e == 0)
|
||||||
|
return fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
||||||
|
"unexpected OpenSSL error");
|
||||||
|
|
||||||
|
ERR_error_string_n (e, buf, G_N_ELEMENTS (buf));
|
||||||
|
|
||||||
|
return fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL, "OpenSSL error: %s",
|
||||||
|
buf);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error)
|
challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *error)
|
||||||
{
|
{
|
||||||
FpiSsm *ssm = user_data;
|
FpiSsm *ssm = user_data;
|
||||||
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
|
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
|
||||||
unsigned char respdata[CR_LENGTH];
|
unsigned char respdata[CR_LENGTH * 2];
|
||||||
PK11Context *ctx;
|
|
||||||
int outlen;
|
int outlen;
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
@@ -261,17 +274,39 @@ challenge_cb (FpiUsbTransfer *transfer, FpDevice *dev, void *user_data, GError *
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (transfer->actual_length != CR_LENGTH)
|
||||||
|
{
|
||||||
|
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
|
"Unexpected buffer length (%" G_GSIZE_FORMAT
|
||||||
|
"instead of %d)",
|
||||||
|
transfer->actual_length, CR_LENGTH);
|
||||||
|
fpi_ssm_mark_failed (ssm, g_steal_pointer (&error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* submit response */
|
/* submit response */
|
||||||
/* produce response from challenge */
|
/* produce response from challenge */
|
||||||
ctx = PK11_CreateContextBySymKey (self->cipher, CKA_ENCRYPT,
|
if (!EVP_EncryptUpdate (self->cipher_ctx, respdata, &outlen, transfer->buffer, CR_LENGTH))
|
||||||
self->symkey, self->param);
|
|
||||||
if (PK11_CipherOp (ctx, respdata, &outlen, CR_LENGTH, transfer->buffer, CR_LENGTH) != SECSuccess ||
|
|
||||||
PK11_Finalize (ctx) != SECSuccess)
|
|
||||||
{
|
{
|
||||||
fp_err ("Failed to encrypt challenge data");
|
fpi_ssm_mark_failed (ssm, openssl_device_error ());
|
||||||
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO, "Failed to encrypt challenge data");
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outlen != CR_LENGTH)
|
||||||
|
{
|
||||||
|
error = fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||||
|
"Unexpected encrypted buffer length (%d"
|
||||||
|
"instead of %d)",
|
||||||
|
outlen, CR_LENGTH);
|
||||||
|
fpi_ssm_mark_failed (ssm, g_steal_pointer (&error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!EVP_EncryptFinal_ex (self->cipher_ctx, respdata + outlen, &outlen))
|
||||||
|
{
|
||||||
|
fpi_ssm_mark_failed (ssm, openssl_device_error ());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
PK11_DestroyContext (ctx, PR_TRUE);
|
|
||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
write_regs (FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm);
|
write_regs (FP_IMAGE_DEVICE (dev), REG_RESPONSE, CR_LENGTH, respdata, response_cb, ssm);
|
||||||
@@ -703,9 +738,9 @@ imaging_run_state (FpiSsm *ssm, FpDevice *_dev)
|
|||||||
|
|
||||||
case IMAGING_DECODE:
|
case IMAGING_DECODE:
|
||||||
key = self->last_reg_rd[0];
|
key = self->last_reg_rd[0];
|
||||||
key |= self->last_reg_rd[1] << 8;
|
key |= (uint32_t) self->last_reg_rd[1] << 8;
|
||||||
key |= self->last_reg_rd[2] << 16;
|
key |= (uint32_t) self->last_reg_rd[2] << 16;
|
||||||
key |= self->last_reg_rd[3] << 24;
|
key |= (uint32_t) self->last_reg_rd[3] << 24;
|
||||||
key ^= self->img_enc_seed;
|
key ^= self->img_enc_seed;
|
||||||
|
|
||||||
fp_dbg ("encryption id %02x -> key %08x", img->key_number, key);
|
fp_dbg ("encryption id %02x -> key %08x", img->key_number, key);
|
||||||
@@ -1270,8 +1305,6 @@ dev_init (FpImageDevice *dev)
|
|||||||
g_autoptr(GPtrArray) interfaces = NULL;
|
g_autoptr(GPtrArray) interfaces = NULL;
|
||||||
GUsbInterface *iface = NULL;
|
GUsbInterface *iface = NULL;
|
||||||
guint64 driver_data;
|
guint64 driver_data;
|
||||||
SECStatus rv;
|
|
||||||
SECItem item;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device (FP_DEVICE (dev)), &error);
|
interfaces = g_usb_device_get_interfaces (fpi_device_get_usb_device (FP_DEVICE (dev)), &error);
|
||||||
@@ -1343,20 +1376,6 @@ dev_init (FpImageDevice *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable loading p11-kit's user configuration */
|
|
||||||
g_setenv ("P11_KIT_NO_USER_CONFIG", "1", TRUE);
|
|
||||||
|
|
||||||
/* Initialise NSS early */
|
|
||||||
rv = NSS_NoDB_Init (".");
|
|
||||||
if (rv != SECSuccess)
|
|
||||||
{
|
|
||||||
fp_err ("could not initialise NSS");
|
|
||||||
fpi_image_device_open_complete (dev,
|
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Could not initialise NSS"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self = FPI_DEVICE_URU4000 (dev);
|
self = FPI_DEVICE_URU4000 (dev);
|
||||||
|
|
||||||
g_clear_pointer (&self->rand, g_rand_free);
|
g_clear_pointer (&self->rand, g_rand_free);
|
||||||
@@ -1369,35 +1388,17 @@ dev_init (FpImageDevice *dev)
|
|||||||
self->interface = g_usb_interface_get_number (iface);
|
self->interface = g_usb_interface_get_number (iface);
|
||||||
|
|
||||||
/* Set up encryption */
|
/* Set up encryption */
|
||||||
self->cipher = CKM_AES_ECB;
|
if (!(self->cipher_ctx = EVP_CIPHER_CTX_new ()))
|
||||||
self->slot = PK11_GetBestSlot (self->cipher, NULL);
|
|
||||||
if (self->slot == NULL)
|
|
||||||
{
|
{
|
||||||
fp_err ("could not get encryption slot");
|
fpi_image_device_open_complete (dev, openssl_device_error ());
|
||||||
fpi_image_device_open_complete (dev,
|
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Could not get encryption slot"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
item.type = siBuffer;
|
|
||||||
item.data = (unsigned char *) crkey;
|
if (!EVP_EncryptInit_ex (self->cipher_ctx, EVP_aes_128_ecb (), NULL, crkey, NULL))
|
||||||
item.len = sizeof (crkey);
|
|
||||||
self->symkey = PK11_ImportSymKey (self->slot,
|
|
||||||
self->cipher,
|
|
||||||
PK11_OriginUnwrap,
|
|
||||||
CKA_ENCRYPT,
|
|
||||||
&item, NULL);
|
|
||||||
if (self->symkey == NULL)
|
|
||||||
{
|
{
|
||||||
fp_err ("failed to import key into NSS");
|
fpi_image_device_open_complete (dev, openssl_device_error ());
|
||||||
PK11_FreeSlot (self->slot);
|
|
||||||
self->slot = NULL;
|
|
||||||
fpi_image_device_open_complete (dev,
|
|
||||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
|
||||||
"Failed to import key into NSS"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self->param = PK11_ParamFromIV (self->cipher, NULL);
|
|
||||||
|
|
||||||
fpi_image_device_open_complete (dev, NULL);
|
fpi_image_device_open_complete (dev, NULL);
|
||||||
}
|
}
|
||||||
@@ -1408,14 +1409,7 @@ dev_deinit (FpImageDevice *dev)
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
|
FpiDeviceUru4000 *self = FPI_DEVICE_URU4000 (dev);
|
||||||
|
|
||||||
if (self->symkey)
|
g_clear_pointer (&self->cipher_ctx, EVP_CIPHER_CTX_free);
|
||||||
PK11_FreeSymKey (self->symkey);
|
|
||||||
if (self->param)
|
|
||||||
SECITEM_FreeItem (self->param, PR_TRUE);
|
|
||||||
if (self->slot)
|
|
||||||
PK11_FreeSlot (self->slot);
|
|
||||||
|
|
||||||
NSS_Shutdown ();
|
|
||||||
|
|
||||||
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)),
|
g_usb_device_release_interface (fpi_device_get_usb_device (FP_DEVICE (dev)),
|
||||||
self->interface, 0, &error);
|
self->interface, 0, &error);
|
||||||
|
|||||||
@@ -772,6 +772,7 @@ fpi_device_virtual_device_class_init (FpDeviceVirtualDeviceClass *klass)
|
|||||||
{
|
{
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
const char *hot_seconds;
|
||||||
|
|
||||||
object_class->finalize = fpi_device_virtual_device_finalize;
|
object_class->finalize = fpi_device_virtual_device_finalize;
|
||||||
|
|
||||||
@@ -787,5 +788,18 @@ fpi_device_virtual_device_class_init (FpDeviceVirtualDeviceClass *klass)
|
|||||||
dev_class->enroll = dev_enroll;
|
dev_class->enroll = dev_enroll;
|
||||||
dev_class->cancel = dev_cancel;
|
dev_class->cancel = dev_cancel;
|
||||||
|
|
||||||
|
if ((hot_seconds = g_getenv ("FP_VIRTUAL_DEVICE_HOT_SECONDS")) &&
|
||||||
|
*hot_seconds != '\0')
|
||||||
|
{
|
||||||
|
gint64 hot_seconds_value;
|
||||||
|
|
||||||
|
hot_seconds_value = g_ascii_strtoll (hot_seconds, NULL, 10);
|
||||||
|
if (hot_seconds_value >= G_MAXINT32 || hot_seconds_value < 0)
|
||||||
|
hot_seconds_value = -1;
|
||||||
|
|
||||||
|
dev_class->temp_hot_seconds = hot_seconds_value;
|
||||||
|
g_debug ("device hot seconds set to %d", dev_class->temp_hot_seconds);
|
||||||
|
}
|
||||||
|
|
||||||
fpi_device_class_auto_initialize_features (dev_class);
|
fpi_device_class_auto_initialize_features (dev_class);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,12 +191,12 @@ on_listener_connected (FpiDeviceVirtualListener *listener,
|
|||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case FPI_IMAGE_DEVICE_STATE_IDLE:
|
|
||||||
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON:
|
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON:
|
||||||
case FPI_IMAGE_DEVICE_STATE_CAPTURE:
|
case FPI_IMAGE_DEVICE_STATE_CAPTURE:
|
||||||
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF:
|
|
||||||
recv_image (self);
|
recv_image (self);
|
||||||
|
|
||||||
|
case FPI_IMAGE_DEVICE_STATE_IDLE:
|
||||||
|
case FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF:
|
||||||
case FPI_IMAGE_DEVICE_STATE_INACTIVE:
|
case FPI_IMAGE_DEVICE_STATE_INACTIVE:
|
||||||
case FPI_IMAGE_DEVICE_STATE_ACTIVATING:
|
case FPI_IMAGE_DEVICE_STATE_ACTIVATING:
|
||||||
case FPI_IMAGE_DEVICE_STATE_DEACTIVATING:
|
case FPI_IMAGE_DEVICE_STATE_DEACTIVATING:
|
||||||
@@ -310,6 +310,7 @@ fpi_device_virtual_image_class_init (FpDeviceVirtualImageClass *klass)
|
|||||||
{
|
{
|
||||||
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
||||||
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass);
|
FpImageDeviceClass *img_class = FP_IMAGE_DEVICE_CLASS (klass);
|
||||||
|
const char *hot_seconds;
|
||||||
|
|
||||||
dev_class->id = FP_COMPONENT;
|
dev_class->id = FP_COMPONENT;
|
||||||
dev_class->full_name = "Virtual image device for debugging";
|
dev_class->full_name = "Virtual image device for debugging";
|
||||||
@@ -321,4 +322,17 @@ fpi_device_virtual_image_class_init (FpDeviceVirtualImageClass *klass)
|
|||||||
|
|
||||||
img_class->activate = dev_activate;
|
img_class->activate = dev_activate;
|
||||||
img_class->deactivate = dev_deactivate;
|
img_class->deactivate = dev_deactivate;
|
||||||
|
|
||||||
|
if ((hot_seconds = g_getenv ("FP_VIRTUAL_IMAGE_HOT_SECONDS")) &&
|
||||||
|
*hot_seconds != '\0')
|
||||||
|
{
|
||||||
|
gint64 hot_seconds_value;
|
||||||
|
|
||||||
|
hot_seconds_value = g_ascii_strtoll (hot_seconds, NULL, 10);
|
||||||
|
if (hot_seconds_value >= G_MAXINT32 || hot_seconds_value < 0)
|
||||||
|
hot_seconds_value = -1;
|
||||||
|
|
||||||
|
dev_class->temp_hot_seconds = hot_seconds_value;
|
||||||
|
g_debug ("device hot seconds set to %d", dev_class->temp_hot_seconds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,342 @@
|
|||||||
|
/*
|
||||||
|
* Virtual driver for SDCP device debugging
|
||||||
|
*
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a virtual driver to debug the SDCP-based drivers.
|
||||||
|
* This virtual driver does not use a socket listener but instead
|
||||||
|
* embeds the simulated logic of the fake "device" directly within
|
||||||
|
* the logic of each function. This driver also allows prints to be
|
||||||
|
* registered programmatically, making it possible to test libfprint
|
||||||
|
* and fprintd.
|
||||||
|
*
|
||||||
|
* This virtual driver will override FpSdcpDevice's dynamically
|
||||||
|
* generated cryptography values and instead replace them with
|
||||||
|
* pre-generated values taken from from Microsoft's sample client
|
||||||
|
* implementation. See:
|
||||||
|
* https://github.com/Microsoft/SecureDeviceConnectionProtocol
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FP_COMPONENT "virtual_sdcp"
|
||||||
|
#include "fpi-log.h"
|
||||||
|
|
||||||
|
#include "../fpi-sdcp.h"
|
||||||
|
#include "virtual-sdcp.h"
|
||||||
|
|
||||||
|
struct _FpDeviceVirtualSdcp
|
||||||
|
{
|
||||||
|
FpSdcpDevice parent;
|
||||||
|
|
||||||
|
GPtrArray *print_ids;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE (FpDeviceVirtualSdcp, fpi_device_virtual_sdcp, FPI, DEVICE_VIRTUAL_SDCP, FpSdcpDevice)
|
||||||
|
G_DEFINE_TYPE (FpDeviceVirtualSdcp, fpi_device_virtual_sdcp, FP_TYPE_SDCP_DEVICE)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
static const guint8 from_hex_map[] = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 01234567
|
||||||
|
0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89:;<=>?
|
||||||
|
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // @abcdef
|
||||||
|
};
|
||||||
|
|
||||||
|
static GBytes *
|
||||||
|
g_bytes_from_hex (const gchar *hex)
|
||||||
|
{
|
||||||
|
g_autoptr(GBytes) res = NULL;
|
||||||
|
guint8 b0, b1;
|
||||||
|
gsize bytes_len = strlen (hex) / 2;
|
||||||
|
guint8 *bytes = g_malloc0 (bytes_len);
|
||||||
|
|
||||||
|
for (int i = 0; i < strlen (hex) - 1; i += 2)
|
||||||
|
{
|
||||||
|
b0 = ((guint8) hex[i + 0] & 0x1F) ^ 0x10;
|
||||||
|
b1 = ((guint8) hex[i + 1] & 0x1F) ^ 0x10;
|
||||||
|
bytes[i / 2] = (guint8) (from_hex_map[b0] << 4) | from_hex_map[b1];
|
||||||
|
}
|
||||||
|
|
||||||
|
res = g_bytes_new_take (bytes, bytes_len);
|
||||||
|
|
||||||
|
return g_steal_pointer (&res);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FpiSdcpClaim *
|
||||||
|
get_fake_sdcp_claim (void)
|
||||||
|
{
|
||||||
|
FpiSdcpClaim *claim = g_new0 (FpiSdcpClaim, 1);
|
||||||
|
|
||||||
|
claim->model_certificate = g_bytes_from_hex (model_certificate_hex);
|
||||||
|
claim->device_public_key = g_bytes_from_hex (device_public_key_hex);
|
||||||
|
claim->firmware_public_key = g_bytes_from_hex (firmware_public_key_hex);
|
||||||
|
claim->firmware_hash = g_bytes_from_hex (firmware_hash_hex);
|
||||||
|
claim->model_signature = g_bytes_from_hex (model_signature_hex);
|
||||||
|
claim->device_signature = g_bytes_from_hex (device_signature_hex);
|
||||||
|
return g_steal_pointer (&claim);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_identify (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceVirtualSdcp *self = FPI_DEVICE_VIRTUAL_SDCP (sdcp_device);
|
||||||
|
g_autoptr(GBytes) enrollment_id = NULL;
|
||||||
|
g_autoptr(GBytes) identify_mac = NULL;
|
||||||
|
GBytes *identify_nonce = NULL;
|
||||||
|
|
||||||
|
if (self->print_ids->len > 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Pretend that the virtual device identified the first print.
|
||||||
|
* Since we used a pre-generated enrollment_id for it, we can also use the
|
||||||
|
* matching pre-generated test identify data for its identification.
|
||||||
|
*/
|
||||||
|
identify_nonce = g_bytes_from_hex (identify_nonce_hex);
|
||||||
|
enrollment_id = g_bytes_from_hex (enrollment_id_hex);
|
||||||
|
fpi_sdcp_device_set_identify_data (sdcp_device, identify_nonce);
|
||||||
|
identify_mac = g_bytes_from_hex (identify_mac_hex);
|
||||||
|
|
||||||
|
fpi_sdcp_device_identify_complete (sdcp_device, enrollment_id, identify_mac, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_identify_complete (sdcp_device, NULL, NULL,
|
||||||
|
fpi_device_error_new (FP_DEVICE_ERROR_DATA_NOT_FOUND));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_enroll_commit (FpSdcpDevice *sdcp_device, GBytes *id)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceVirtualSdcp *self = FPI_DEVICE_VIRTUAL_SDCP (sdcp_device);
|
||||||
|
g_autoptr(GBytes) expected_first_print_id = NULL;
|
||||||
|
GBytes *print_id;
|
||||||
|
|
||||||
|
print_id = g_bytes_new (g_bytes_get_data (id, NULL), g_bytes_get_size (id));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this is the first print, it is probably good if we make sure the
|
||||||
|
* internal API assigned it the expected pre-known ID
|
||||||
|
*/
|
||||||
|
if (self->print_ids->len == 0)
|
||||||
|
{
|
||||||
|
expected_first_print_id = g_bytes_from_hex (enrollment_id_hex);
|
||||||
|
if (!g_bytes_equal (print_id, expected_first_print_id))
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_enroll_commit_complete (sdcp_device,
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_UNTRUSTED,
|
||||||
|
"First enrolled print ID does not match expected value"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ptr_array_add (self->print_ids, g_steal_pointer (&print_id));
|
||||||
|
|
||||||
|
fpi_sdcp_device_enroll_commit_complete (sdcp_device, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_enroll (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceVirtualSdcp *self = FPI_DEVICE_VIRTUAL_SDCP (sdcp_device);
|
||||||
|
FpDevice *device = FP_DEVICE (sdcp_device);
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
g_autoptr(GBytes) nonce = NULL;
|
||||||
|
FpPrint *print;
|
||||||
|
|
||||||
|
fpi_device_get_enroll_data (device, &print);
|
||||||
|
|
||||||
|
if (self->print_ids->len == 0)
|
||||||
|
{
|
||||||
|
/* Use the hard-coded nonce for the first enrollment */
|
||||||
|
nonce = g_bytes_from_hex (enrollment_nonce_hex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Generate a new nonce for all other enrollments */
|
||||||
|
nonce = fpi_sdcp_generate_random (&error);
|
||||||
|
if (error)
|
||||||
|
fpi_device_enroll_progress (device, 0, print, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_device_enroll_progress (device, 1, print, NULL);
|
||||||
|
fpi_sdcp_device_enroll_commit (sdcp_device, nonce, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_list (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceVirtualSdcp *self = FPI_DEVICE_VIRTUAL_SDCP (sdcp_device);
|
||||||
|
GPtrArray *print_ids = g_ptr_array_new_with_free_func ((GDestroyNotify) g_bytes_unref);
|
||||||
|
|
||||||
|
for (gint i = 0; i < self->print_ids->len; i++)
|
||||||
|
{
|
||||||
|
GBytes *print_id = g_ptr_array_index (self->print_ids, i);
|
||||||
|
fp_dbg ("print %d:", i);
|
||||||
|
fp_dbg_hex_dump_gbytes (print_id);
|
||||||
|
g_ptr_array_add (print_ids, g_bytes_new (g_bytes_get_data (print_id, NULL),
|
||||||
|
g_bytes_get_size (print_id)));
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_sdcp_device_list_complete (sdcp_device, g_steal_pointer (&print_ids), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_reconnect (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
g_autoptr(GBytes) random = NULL;
|
||||||
|
g_autoptr(GBytes) reconnect_mac = g_bytes_from_hex (reconnect_mac_hex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Normally, a driver would fetch the reconnect data and then send it to the
|
||||||
|
* device's Reconnect command. In this fake device, we will just fetch and
|
||||||
|
* verify the random was generated but do nothing with it
|
||||||
|
*/
|
||||||
|
|
||||||
|
fpi_sdcp_device_get_reconnect_data (sdcp_device, &random);
|
||||||
|
|
||||||
|
g_assert (random);
|
||||||
|
g_assert (g_bytes_get_size (random) == SDCP_RANDOM_SIZE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In emulation mode (FP_DEVICE_EMULATION=1), a different hard-coded random is
|
||||||
|
* set in fpi-sdcp-device, which was the same random used to generate the
|
||||||
|
* reconnect_mac value provided here
|
||||||
|
*/
|
||||||
|
|
||||||
|
fpi_sdcp_device_reconnect_complete (sdcp_device, reconnect_mac, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_connect (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
g_autoptr(GBytes) host_random = NULL;
|
||||||
|
g_autoptr(GBytes) host_public_key = NULL;
|
||||||
|
g_autoptr(GBytes) device_random = g_bytes_from_hex (device_random_hex);
|
||||||
|
g_autoptr(GBytes) connect_mac = g_bytes_from_hex (connect_mac_hex);
|
||||||
|
g_autoptr(FpiSdcpClaim) claim = get_fake_sdcp_claim ();
|
||||||
|
|
||||||
|
fpi_sdcp_device_get_connect_data (sdcp_device, &host_random, &host_public_key);
|
||||||
|
|
||||||
|
g_assert (host_random);
|
||||||
|
g_assert (g_bytes_get_size (host_random) == SDCP_RANDOM_SIZE);
|
||||||
|
|
||||||
|
g_assert (host_public_key);
|
||||||
|
g_assert (g_bytes_get_size (host_public_key) == SDCP_PUBLIC_KEY_SIZE);
|
||||||
|
|
||||||
|
fpi_sdcp_device_connect_complete (sdcp_device, device_random, claim, connect_mac, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_close (FpDevice *device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
fpi_device_close_complete (device, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dev_open (FpSdcpDevice *sdcp_device)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpSdcpDeviceClass *klass = FP_SDCP_DEVICE_GET_CLASS (sdcp_device);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_getenv ("FP_VIRTUAL_SDCP_NO_RECONNECT"), "1") == 0)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: FP_VIRTUAL_SDCP_NO_RECONNECT=1; disabling SDCP reconnect");
|
||||||
|
klass->reconnect = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: FP_VIRTUAL_SDCP_NO_RECONNECT!=1; enabling SDCP reconnect");
|
||||||
|
klass->reconnect = dev_reconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_sdcp_device_open_complete (sdcp_device, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fpi_device_virtual_sdcp_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceVirtualSdcp *self = FPI_DEVICE_VIRTUAL_SDCP (object);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->print_ids, g_ptr_array_unref);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (fpi_device_virtual_sdcp_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fpi_device_virtual_sdcp_init (FpDeviceVirtualSdcp *self)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
|
||||||
|
/* Force FP_DEVICE_EMULATION=1 when using FpDeviceVirtualSdcp */
|
||||||
|
g_setenv ("FP_DEVICE_EMULATION", "1", TRUE);
|
||||||
|
|
||||||
|
self->print_ids = g_ptr_array_new_with_free_func ((GDestroyNotify) g_bytes_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const FpIdEntry driver_ids[] = {
|
||||||
|
{ .virtual_envvar = "FP_VIRTUAL_SDCP" },
|
||||||
|
{ .virtual_envvar = NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
fpi_device_virtual_sdcp_class_init (FpDeviceVirtualSdcpClass *klass)
|
||||||
|
{
|
||||||
|
fp_dbg ("Virtual SDCP device: %s()", G_STRFUNC);
|
||||||
|
FpDeviceClass *dev_class = FP_DEVICE_CLASS (klass);
|
||||||
|
FpSdcpDeviceClass *sdcp_dev_class = FP_SDCP_DEVICE_CLASS (klass);
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = fpi_device_virtual_sdcp_finalize;
|
||||||
|
|
||||||
|
dev_class->id = FP_COMPONENT;
|
||||||
|
dev_class->full_name = "Virtual SDCP device for debugging";
|
||||||
|
dev_class->type = FP_DEVICE_TYPE_VIRTUAL;
|
||||||
|
dev_class->id_table = driver_ids;
|
||||||
|
dev_class->nr_enroll_stages = 1;
|
||||||
|
dev_class->scan_type = FP_SCAN_TYPE_PRESS;
|
||||||
|
|
||||||
|
sdcp_dev_class->ignore_device_certificate = FALSE;
|
||||||
|
sdcp_dev_class->ignore_device_signatures = FALSE;
|
||||||
|
|
||||||
|
sdcp_dev_class->open = dev_open;
|
||||||
|
sdcp_dev_class->connect = dev_connect;
|
||||||
|
sdcp_dev_class->reconnect = dev_reconnect;
|
||||||
|
|
||||||
|
sdcp_dev_class->list = dev_list;
|
||||||
|
sdcp_dev_class->enroll = dev_enroll;
|
||||||
|
sdcp_dev_class->enroll_commit = dev_enroll_commit;
|
||||||
|
sdcp_dev_class->identify = dev_identify;
|
||||||
|
|
||||||
|
dev_class->close = dev_close;
|
||||||
|
|
||||||
|
fpi_device_class_auto_initialize_features (dev_class);
|
||||||
|
dev_class->features |= FP_DEVICE_FEATURE_STORAGE;
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Virtual driver test payloads for SDCP device debugging
|
||||||
|
*
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "fpi-compat.h"
|
||||||
|
|
||||||
|
/* host keys */
|
||||||
|
|
||||||
|
static const gchar host_private_key_hex[] = "8400ed14579cdf11586477e836e8cb52708441c1c2a447c218c5bbc2d118fbc7";
|
||||||
|
static const gchar host_public_key_hex[] = "0452f056ffb9c6728654771a3629b770767b19a2106a4916fb81ba06ef6797c4"
|
||||||
|
"a3df672ade0e9116d1abe278a8223abde4958d62d4ff6882159f0617c6f8ce10"
|
||||||
|
"bf";
|
||||||
|
static const gchar host_random_hex[] = "d877403abe82f4d97e1448c5052d83a532a45e56ef049cbbf981137520e713bf";
|
||||||
|
|
||||||
|
/* device keys */
|
||||||
|
|
||||||
|
static const gchar device_random_hex[] = "6e2f6c1abef2a1973fb1315a17e209fdb0c78520f1fd6a85d294d7aeb40a04a7";
|
||||||
|
static const gchar model_certificate_hex[] = "30820323308202caa00302010202133300000004c45d661d6eed040d00000000"
|
||||||
|
"0004300a06082a8648ce3d0403023056310b3009060355040613025553311e30"
|
||||||
|
"1c060355040a13154d6963726f736f667420436f72706f726174696f6e312730"
|
||||||
|
"250603550403131e57696e646f77732048656c6c6f2032303936414443432043"
|
||||||
|
"412032303231301e170d3232303130343231303033355a170d32333034303432"
|
||||||
|
"31303033355a301c311a3018060355040313115365637572652042494f205365"
|
||||||
|
"6e736f723059301306072a8648ce3d020106082a8648ce3d0301070342000414"
|
||||||
|
"cfc287f872a2b7d3339e0b31390e3ca688e61165eaa6687c959270e07666b1fa"
|
||||||
|
"19e3efaf1750d134a886d494424fe471970c4b06838408a18d1f5d57735dd7a3"
|
||||||
|
"8201af308201ab30750603551d11046e306ca46a30683132303006082b060104"
|
||||||
|
"82376402132436423045413344382d383339372d343444332d383043392d3930"
|
||||||
|
"324130414346344343303132303006082b060104823764011324413944423730"
|
||||||
|
"32362d433646462d344341462d423134382d393133454641333730423933301d"
|
||||||
|
"0603551d0e04160414db6d66d642b7236d5e6bb2ec2186decda98067b6301f06"
|
||||||
|
"03551d23041830168014bf3748e34a632de953a3ba890298c069472a99b9305f"
|
||||||
|
"0603551d1f045830563054a052a050864e687474703a2f2f7777772e6d696372"
|
||||||
|
"6f736f66742e636f6d2f706b696f70732f63726c2f57696e646f777325323048"
|
||||||
|
"656c6c6f25323032303936414443432532304341253230323032312e63726c30"
|
||||||
|
"6c06082b060105050701010460305e305c06082b060105050730028650687474"
|
||||||
|
"703a2f2f7777772e6d6963726f736f66742e636f6d2f706b696f70732f636572"
|
||||||
|
"74732f57696e646f777325323048656c6c6f2532303230393641444343253230"
|
||||||
|
"4341253230323032312e637274300c0603551d130101ff040230003015060355"
|
||||||
|
"1d25040e300c060a2b0601040182374c2b01300a06082a8648ce3d0403020347"
|
||||||
|
"003044022077553ef520f732e03cd740c8cf807e6366e12918bc581f75bfe0f1"
|
||||||
|
"95b7b1fd4f0220324e25b93b9da7538b797a624272b21b7cc0e96ea487924250"
|
||||||
|
"4677600450f283";
|
||||||
|
static const gchar device_public_key_hex[] = "04e2787890a684f95b96b9a2316ca8d3d33d4d79ff4c89dc6f9e888e973990d1"
|
||||||
|
"d3154133dcc8bd33b99af9dbf0673390d404d092498a3f214cd93f9b9f28fb5f"
|
||||||
|
"66";
|
||||||
|
static const gchar firmware_public_key_hex[] = "04f06a84ab51a3a6e8ff46868f91dd720e4cdad21f2e090d11e8f9bfc2ea19ee"
|
||||||
|
"1b5eac850b4532968a9399f76cd779e7723e8c2ca73b597c0df5f73b94a36f2b"
|
||||||
|
"6c";
|
||||||
|
static const gchar firmware_hash_hex[] = "c3bf47ea1f4a4a605470313cacb3a44f4a461f68c6faeab07e737610cb5ac835";
|
||||||
|
static const gchar model_signature_hex[] = "febe6ba3107813e185f05189e69ae79d9f7a40802582d94324459844c8b97ec6"
|
||||||
|
"c5daed5462276cb8a193c33e350424b0305d63d79a93a9188dcfc0cb5595f6c1";
|
||||||
|
static const gchar device_signature_hex[] = "10cc57dd8dafb463510a7327a5fca49b698e999b36448e2023eaf0dff0b0d4a3"
|
||||||
|
"4f1caf4e872b77364a0a00d7476554d0324c4cc931937e232a0315837d696c06";
|
||||||
|
static const gchar connect_mac_hex[] = "422bc475a78f972bae842a28e5ad721207457fcbd9a1a3aaf71587c07b84d247";
|
||||||
|
|
||||||
|
/* expected application_secret based on above */
|
||||||
|
|
||||||
|
static const gchar application_secret_hex[] = "13330ba3135ecf5dc71cede01a886540771efab35c8ba053902b2c1ee7de6efe";
|
||||||
|
|
||||||
|
/* test verify_reconnect values */
|
||||||
|
|
||||||
|
static const gchar reconnect_random_hex[] = "8a7451c1d3a8dca1c1330ca50d73454b351a49f46c8e9dcee15c964d295c31c9";
|
||||||
|
static const gchar reconnect_mac_hex[] = "bf3f3bb3bd6ecb2784c160f526f7bc3b3ca8faf5557194c48e0024a0493903c7";
|
||||||
|
|
||||||
|
/* test enrollment_id values */
|
||||||
|
|
||||||
|
static const gchar enrollment_nonce_hex[] = "c2101c44c9a667bba397e81f48b143398603e2c9335a68b409e1dbe71e005ca2";
|
||||||
|
static const gchar enrollment_id_hex[] = "67109dc70a216331f1580ddac601915929c1ff6c9bcba6544ba572c660c3d91e";
|
||||||
|
|
||||||
|
/* test verify_identify values */
|
||||||
|
|
||||||
|
static const gchar identify_nonce_hex[] = "3a1b506f5bec089059acefb9b44dfbdea7a599ee9aa267e5252664d60b798053";
|
||||||
|
static const gchar identify_mac_hex[] = "53a723eef40713094a90c5ef9996cbd6ba268e30676cd7107705a6c3e3e1eff9";
|
||||||
@@ -27,10 +27,6 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ifdef HAVE_LIBFPRINT_TOD
|
|
||||||
#include "tod/tod-shared-loader.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_UDEV
|
#ifdef HAVE_UDEV
|
||||||
#include <gudev/gudev.h>
|
#include <gudev/gudev.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -300,8 +296,6 @@ fp_context_finalize (GObject *object)
|
|||||||
g_object_run_dispose (G_OBJECT (priv->usb_ctx));
|
g_object_run_dispose (G_OBJECT (priv->usb_ctx));
|
||||||
g_clear_object (&priv->usb_ctx);
|
g_clear_object (&priv->usb_ctx);
|
||||||
|
|
||||||
tod_shared_drivers_unregister ();
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (fp_context_parent_class)->finalize (object);
|
G_OBJECT_CLASS (fp_context_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,7 +351,6 @@ static void
|
|||||||
fp_context_init (FpContext *self)
|
fp_context_init (FpContext *self)
|
||||||
{
|
{
|
||||||
g_autoptr(GError) error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
g_autoptr(GArray) shared_drivers = NULL;
|
|
||||||
FpContextPrivate *priv = fp_context_get_instance_private (self);
|
FpContextPrivate *priv = fp_context_get_instance_private (self);
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
@@ -365,10 +358,6 @@ fp_context_init (FpContext *self)
|
|||||||
|
|
||||||
priv->drivers = fpi_get_driver_types ();
|
priv->drivers = fpi_get_driver_types ();
|
||||||
|
|
||||||
tod_shared_drivers_register ();
|
|
||||||
shared_drivers = tod_shared_drivers_get ();
|
|
||||||
g_array_prepend_vals (priv->drivers, shared_drivers->data, shared_drivers->len);
|
|
||||||
|
|
||||||
if (get_drivers_allowlist_env ())
|
if (get_drivers_allowlist_env ())
|
||||||
{
|
{
|
||||||
for (i = 0; i < priv->drivers->len;)
|
for (i = 0; i < priv->drivers->len;)
|
||||||
|
|||||||
+15
-12
@@ -292,14 +292,14 @@ fp_device_get_property (GObject *object,
|
|||||||
|
|
||||||
case PROP_FPI_UDEV_DATA_SPIDEV:
|
case PROP_FPI_UDEV_DATA_SPIDEV:
|
||||||
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
||||||
g_value_set_string (value, g_strdup (priv->udev_data.spidev_path));
|
g_value_set_string (value, priv->udev_data.spidev_path);
|
||||||
else
|
else
|
||||||
g_value_set_string (value, NULL);
|
g_value_set_string (value, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_FPI_UDEV_DATA_HIDRAW:
|
case PROP_FPI_UDEV_DATA_HIDRAW:
|
||||||
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
if (cls->type == FP_DEVICE_TYPE_UDEV)
|
||||||
g_value_set_string (value, g_strdup (priv->udev_data.hidraw_path));
|
g_value_set_string (value, priv->udev_data.hidraw_path);
|
||||||
else
|
else
|
||||||
g_value_set_string (value, NULL);
|
g_value_set_string (value, NULL);
|
||||||
break;
|
break;
|
||||||
@@ -483,6 +483,9 @@ fp_device_class_init (FpDeviceClass *klass)
|
|||||||
NULL,
|
NULL,
|
||||||
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
|
G_PARAM_STATIC_STRINGS | G_PARAM_READABLE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FpDevice:open: (getter is_open):
|
||||||
|
*/
|
||||||
properties[PROP_OPEN] =
|
properties[PROP_OPEN] =
|
||||||
g_param_spec_boolean ("open",
|
g_param_spec_boolean ("open",
|
||||||
"Opened",
|
"Opened",
|
||||||
@@ -1103,8 +1106,8 @@ enroll_data_free (FpEnrollData *data)
|
|||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @template_print: (transfer floating): a #FpPrint
|
* @template_print: (transfer floating): a #FpPrint
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
* @progress_cb: (nullable) (scope notified): progress reporting callback
|
* @progress_cb: (nullable) (closure progress_data) (scope notified): progress reporting callback
|
||||||
* @progress_data: (closure progress_cb): user data for @progress_cb
|
* @progress_data: user data for @progress_cb
|
||||||
* @progress_destroy: (destroy progress_data): Destroy notify for @progress_data
|
* @progress_destroy: (destroy progress_data): Destroy notify for @progress_data
|
||||||
* @callback: (scope async): the function to call on completion
|
* @callback: (scope async): the function to call on completion
|
||||||
* @user_data: the data to pass to @callback
|
* @user_data: the data to pass to @callback
|
||||||
@@ -1248,8 +1251,8 @@ match_data_free (FpMatchData *data)
|
|||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @enrolled_print: a #FpPrint to verify
|
* @enrolled_print: a #FpPrint to verify
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
* @match_cb: (nullable) (scope notified): match reporting callback
|
* @match_cb: (nullable) (scope notified) (closure match_data): match reporting callback
|
||||||
* @match_data: (closure match_cb): user data for @match_cb
|
* @match_data: user data for @match_cb
|
||||||
* @match_destroy: (destroy match_data): Destroy notify for @match_data
|
* @match_destroy: (destroy match_data): Destroy notify for @match_data
|
||||||
* @callback: the function to call on completion
|
* @callback: the function to call on completion
|
||||||
* @user_data: the data to pass to @callback
|
* @user_data: the data to pass to @callback
|
||||||
@@ -1374,8 +1377,8 @@ fp_device_verify_finish (FpDevice *device,
|
|||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
|
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
* @match_cb: (nullable) (scope notified): match reporting callback
|
* @match_cb: (nullable) (scope notified) (closure match_data): match reporting callback
|
||||||
* @match_data: (closure match_cb): user data for @match_cb
|
* @match_data: user data for @match_cb
|
||||||
* @match_destroy: (destroy match_data): Destroy notify for @match_data
|
* @match_destroy: (destroy match_data): Destroy notify for @match_data
|
||||||
* @callback: the function to call on completion
|
* @callback: the function to call on completion
|
||||||
* @user_data: the data to pass to @callback
|
* @user_data: the data to pass to @callback
|
||||||
@@ -1943,8 +1946,8 @@ fp_device_enroll_sync (FpDevice *device,
|
|||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @enrolled_print: a #FpPrint to verify
|
* @enrolled_print: a #FpPrint to verify
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
* @match_cb: (nullable) (scope call): match reporting callback
|
* @match_cb: (nullable) (scope call) (closure match_data): match reporting callback
|
||||||
* @match_data: (closure match_cb): user data for @match_cb
|
* @match_data: user data for @match_cb
|
||||||
* @match: (out): Whether the user presented the correct finger
|
* @match: (out): Whether the user presented the correct finger
|
||||||
* @print: (out) (transfer full) (nullable): Location to store the scanned print, or %NULL to ignore
|
* @print: (out) (transfer full) (nullable): Location to store the scanned print, or %NULL to ignore
|
||||||
* @error: Return location for errors, or %NULL to ignore
|
* @error: Return location for errors, or %NULL to ignore
|
||||||
@@ -1983,8 +1986,8 @@ fp_device_verify_sync (FpDevice *device,
|
|||||||
* @device: a #FpDevice
|
* @device: a #FpDevice
|
||||||
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
|
* @prints: (element-type FpPrint) (transfer none): #GPtrArray of #FpPrint
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
* @match_cb: (nullable) (scope call): match reporting callback
|
* @match_cb: (nullable) (scope call) (closure match_data): match reporting callback
|
||||||
* @match_data: (closure match_cb): user data for @match_cb
|
* @match_data: user data for @match_cb
|
||||||
* @match: (out) (transfer full) (nullable): Location for the matched #FpPrint, or %NULL
|
* @match: (out) (transfer full) (nullable): Location for the matched #FpPrint, or %NULL
|
||||||
* @print: (out) (transfer full) (nullable): Location for the new #FpPrint, or %NULL
|
* @print: (out) (transfer full) (nullable): Location for the new #FpPrint, or %NULL
|
||||||
* @error: Return location for errors, or %NULL to ignore
|
* @error: Return location for errors, or %NULL to ignore
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ G_DECLARE_DERIVABLE_TYPE (FpDevice, fp_device, FP, DEVICE, GObject)
|
|||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FP_DEVICE_TYPE_VIRTUAL,
|
FP_DEVICE_TYPE_VIRTUAL,
|
||||||
FP_DEVICE_TYPE_USB,
|
|
||||||
FP_DEVICE_TYPE_UDEV,
|
FP_DEVICE_TYPE_UDEV,
|
||||||
|
FP_DEVICE_TYPE_USB,
|
||||||
} FpDeviceType;
|
} FpDeviceType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,6 +113,8 @@ typedef enum {
|
|||||||
* @FP_DEVICE_RETRY_REMOVE_FINGER: The scan did not succeed due to quality or
|
* @FP_DEVICE_RETRY_REMOVE_FINGER: The scan did not succeed due to quality or
|
||||||
* pressure problems; the user should remove their finger from the scanner
|
* pressure problems; the user should remove their finger from the scanner
|
||||||
* before retrying.
|
* before retrying.
|
||||||
|
* @FP_DEVICE_RETRY_TOO_FAST: The scan did not succeed because the finger
|
||||||
|
* swipe or touch was too fast.
|
||||||
*
|
*
|
||||||
* Error codes representing scan failures resulting in the user needing to
|
* Error codes representing scan failures resulting in the user needing to
|
||||||
* retry.
|
* retry.
|
||||||
@@ -122,6 +124,7 @@ typedef enum {
|
|||||||
FP_DEVICE_RETRY_TOO_SHORT,
|
FP_DEVICE_RETRY_TOO_SHORT,
|
||||||
FP_DEVICE_RETRY_CENTER_FINGER,
|
FP_DEVICE_RETRY_CENTER_FINGER,
|
||||||
FP_DEVICE_RETRY_REMOVE_FINGER,
|
FP_DEVICE_RETRY_REMOVE_FINGER,
|
||||||
|
FP_DEVICE_RETRY_TOO_FAST,
|
||||||
} FpDeviceRetry;
|
} FpDeviceRetry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -140,6 +143,7 @@ typedef enum {
|
|||||||
* @FP_DEVICE_ERROR_DATA_DUPLICATE: Enrolling template duplicates storaged templates
|
* @FP_DEVICE_ERROR_DATA_DUPLICATE: Enrolling template duplicates storaged templates
|
||||||
* @FP_DEVICE_ERROR_REMOVED: The device has been removed.
|
* @FP_DEVICE_ERROR_REMOVED: The device has been removed.
|
||||||
* @FP_DEVICE_ERROR_TOO_HOT: The device might be getting too hot
|
* @FP_DEVICE_ERROR_TOO_HOT: The device might be getting too hot
|
||||||
|
* @FP_DEVICE_ERROR_UNTRUSTED: Device cannot be trusted
|
||||||
*
|
*
|
||||||
* Error codes for device operations. More specific errors from other domains
|
* Error codes for device operations. More specific errors from other domains
|
||||||
* such as #G_IO_ERROR or #G_USB_DEVICE_ERROR may also be reported.
|
* such as #G_IO_ERROR or #G_USB_DEVICE_ERROR may also be reported.
|
||||||
@@ -158,6 +162,7 @@ typedef enum {
|
|||||||
/* Leave some room to add more DATA related errors */
|
/* Leave some room to add more DATA related errors */
|
||||||
FP_DEVICE_ERROR_REMOVED = 0x100,
|
FP_DEVICE_ERROR_REMOVED = 0x100,
|
||||||
FP_DEVICE_ERROR_TOO_HOT,
|
FP_DEVICE_ERROR_TOO_HOT,
|
||||||
|
FP_DEVICE_ERROR_UNTRUSTED,
|
||||||
} FpDeviceError;
|
} FpDeviceError;
|
||||||
|
|
||||||
GQuark fp_device_retry_quark (void);
|
GQuark fp_device_retry_quark (void);
|
||||||
|
|||||||
@@ -605,7 +605,7 @@ fp_print_equal (FpPrint *self, FpPrint *other)
|
|||||||
if (g_strcmp0 (self->device_id, other->device_id))
|
if (g_strcmp0 (self->device_id, other->device_id))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (self->type == FPI_PRINT_RAW)
|
if (self->type == FPI_PRINT_RAW || self->type == FPI_PRINT_SDCP)
|
||||||
{
|
{
|
||||||
return g_variant_equal (self->data, other->data);
|
return g_variant_equal (self->data, other->data);
|
||||||
}
|
}
|
||||||
@@ -870,7 +870,7 @@ fp_print_deserialize (const guchar *data,
|
|||||||
g_ptr_array_add (result->prints, g_steal_pointer (&xyt));
|
g_ptr_array_add (result->prints, g_steal_pointer (&xyt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (type == FPI_PRINT_RAW)
|
else if (type == FPI_PRINT_RAW || type == FPI_PRINT_SDCP)
|
||||||
{
|
{
|
||||||
g_autoptr(GVariant) fp_data = g_variant_get_child_value (print_data, 0);
|
g_autoptr(GVariant) fp_data = g_variant_get_child_value (print_data, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* FpSdcpDevice - A base class for SDCP enabled devices
|
||||||
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "fpi-sdcp-device.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GBytes *host_private_key;
|
||||||
|
GBytes *host_public_key;
|
||||||
|
GBytes *host_random;
|
||||||
|
GBytes *reconnect_random;
|
||||||
|
GBytes *identify_nonce;
|
||||||
|
GBytes *data;
|
||||||
|
} FpSdcpDevicePrivate;
|
||||||
|
|
||||||
|
void fpi_sdcp_device_get_application_secret (FpSdcpDevice *self,
|
||||||
|
GBytes **application_secret);
|
||||||
|
void fpi_sdcp_device_set_application_secret (FpSdcpDevice *self,
|
||||||
|
GBytes *application_secret);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_open (FpSdcpDevice *self);
|
||||||
|
void fpi_sdcp_device_connect (FpSdcpDevice *self);
|
||||||
|
void fpi_sdcp_device_reconnect (FpSdcpDevice *self);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_list (FpSdcpDevice *self);
|
||||||
|
void fpi_sdcp_device_enroll (FpSdcpDevice *self);
|
||||||
|
void fpi_sdcp_device_identify (FpSdcpDevice *self);
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* FpSdcpDevice - A base class for SDCP enabled devices
|
||||||
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FP_COMPONENT "sdcp_device"
|
||||||
|
#include "fpi-log.h"
|
||||||
|
|
||||||
|
#include "fp-sdcp-device-private.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION: fp-sdcp-device
|
||||||
|
* @title: FpSdcpDevice
|
||||||
|
* @short_description: SDCP device subclass
|
||||||
|
*
|
||||||
|
* This is a base class for devices implementing the SDCP security protocol.
|
||||||
|
*/
|
||||||
|
|
||||||
|
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (FpSdcpDevice, fp_sdcp_device, FP_TYPE_DEVICE)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_SDCP_DATA,
|
||||||
|
N_PROPS
|
||||||
|
};
|
||||||
|
|
||||||
|
static GParamSpec *properties[N_PROPS];
|
||||||
|
|
||||||
|
/*******************************************************/
|
||||||
|
|
||||||
|
/* Callbacks/vfuncs */
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_open (FpDevice *device)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = FP_SDCP_DEVICE (device);
|
||||||
|
|
||||||
|
fpi_sdcp_device_open (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_list (FpDevice *device)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = FP_SDCP_DEVICE (device);
|
||||||
|
|
||||||
|
fpi_sdcp_device_list (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_enroll (FpDevice *device)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = FP_SDCP_DEVICE (device);
|
||||||
|
|
||||||
|
fpi_sdcp_device_enroll (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_identify (FpDevice *device)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = FP_SDCP_DEVICE (device);
|
||||||
|
|
||||||
|
fpi_sdcp_device_identify (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = (FpSdcpDevice *) object;
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->host_private_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_public_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_random, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->reconnect_random, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->data, g_bytes_unref);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (fp_sdcp_device_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_get_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = (FpSdcpDevice *) object;
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_SDCP_DATA:
|
||||||
|
g_value_set_boxed (value, priv->data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_set_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
FpSdcpDevice *self = FP_SDCP_DEVICE (object);
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_SDCP_DATA:
|
||||||
|
g_clear_pointer (&priv->data, g_bytes_unref);
|
||||||
|
priv->data = g_value_dup_boxed (value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_constructed (GObject *obj)
|
||||||
|
{
|
||||||
|
G_OBJECT_CLASS (fp_sdcp_device_parent_class)->constructed (obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_class_init (FpSdcpDeviceClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
FpDeviceClass *fp_device_class = FP_DEVICE_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = fp_sdcp_device_finalize;
|
||||||
|
object_class->get_property = fp_sdcp_device_get_property;
|
||||||
|
object_class->set_property = fp_sdcp_device_set_property;
|
||||||
|
object_class->constructed = fp_sdcp_device_constructed;
|
||||||
|
|
||||||
|
fp_device_class->open = fp_sdcp_device_open;
|
||||||
|
fp_device_class->list = fp_sdcp_device_list;
|
||||||
|
fp_device_class->enroll = fp_sdcp_device_enroll;
|
||||||
|
fp_device_class->verify = fp_sdcp_device_identify;
|
||||||
|
fp_device_class->identify = fp_sdcp_device_identify;
|
||||||
|
|
||||||
|
properties[PROP_SDCP_DATA] =
|
||||||
|
g_param_spec_boxed ("sdcp-data",
|
||||||
|
"SDCP Data",
|
||||||
|
"SDCP-related device data that should be persisted and used with the "
|
||||||
|
"device during the current system boot",
|
||||||
|
G_TYPE_BYTES,
|
||||||
|
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, N_PROPS, properties);
|
||||||
|
|
||||||
|
fpi_device_class_auto_initialize_features (fp_device_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fp_sdcp_device_init (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Shared library loader for libfprint
|
* FpSdcpDevice - A base class for SDCP enabled devices
|
||||||
* Copyright (C) 2019 Marco Trevisan <marco.trevisan@canonical.com>
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@@ -19,10 +19,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <glib.h>
|
#include <fp-device.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
void tod_shared_drivers_register (void);
|
#define FP_TYPE_SDCP_DEVICE (fp_sdcp_device_get_type ())
|
||||||
void tod_shared_drivers_unregister (void);
|
G_DECLARE_DERIVABLE_TYPE (FpSdcpDevice, fp_sdcp_device, FP, SDCP_DEVICE, FpDevice)
|
||||||
|
|
||||||
GArray *tod_shared_drivers_get (void);
|
G_END_DECLS
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "fp-image.h"
|
#include "fp-image.h"
|
||||||
#include "tod/tod-macros.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fpi_frame:
|
* fpi_frame:
|
||||||
@@ -111,9 +110,6 @@ struct fpi_line_asmbl_ctx
|
|||||||
unsigned char (*get_pixel)(struct fpi_line_asmbl_ctx *ctx,
|
unsigned char (*get_pixel)(struct fpi_line_asmbl_ctx *ctx,
|
||||||
GSList *line,
|
GSList *line,
|
||||||
unsigned int x);
|
unsigned int x);
|
||||||
|
|
||||||
/*< private >*/
|
|
||||||
TOD_PADDING (32, 0);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FpImage *fpi_assemble_lines (struct fpi_line_asmbl_ctx *ctx,
|
FpImage *fpi_assemble_lines (struct fpi_line_asmbl_ctx *ctx,
|
||||||
|
|||||||
@@ -675,4 +675,6 @@ fpi_byte_reader_skip_inline (FpiByteReader * reader, guint nbytes)
|
|||||||
|
|
||||||
#endif /* FPI_BYTE_READER_DISABLE_INLINES */
|
#endif /* FPI_BYTE_READER_DISABLE_INLINES */
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiByteReader, fpi_byte_reader_free);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@@ -75,7 +75,8 @@ fpi_byte_writer_new_with_size (guint size, gboolean fixed)
|
|||||||
FpiByteWriter *ret = fpi_byte_writer_new ();
|
FpiByteWriter *ret = fpi_byte_writer_new ();
|
||||||
|
|
||||||
ret->alloc_size = size;
|
ret->alloc_size = size;
|
||||||
ret->parent.data = g_malloc (ret->alloc_size);
|
ret->parent.data = g_malloc0 (ret->alloc_size);
|
||||||
|
ret->parent.size = size;
|
||||||
ret->fixed = fixed;
|
ret->fixed = fixed;
|
||||||
ret->owned = TRUE;
|
ret->owned = TRUE;
|
||||||
|
|
||||||
@@ -142,7 +143,8 @@ fpi_byte_writer_init_with_size (FpiByteWriter * writer, guint size,
|
|||||||
|
|
||||||
fpi_byte_writer_init (writer);
|
fpi_byte_writer_init (writer);
|
||||||
|
|
||||||
writer->parent.data = g_malloc (size);
|
writer->parent.data = g_malloc0 (size);
|
||||||
|
writer->parent.size = size;
|
||||||
writer->alloc_size = size;
|
writer->alloc_size = size;
|
||||||
writer->fixed = fixed;
|
writer->fixed = fixed;
|
||||||
writer->owned = TRUE;
|
writer->owned = TRUE;
|
||||||
@@ -209,10 +211,9 @@ fpi_byte_writer_reset_and_get_data (FpiByteWriter * writer)
|
|||||||
|
|
||||||
g_return_val_if_fail (writer != NULL, NULL);
|
g_return_val_if_fail (writer != NULL, NULL);
|
||||||
|
|
||||||
data = (guint8 *) writer->parent.data;
|
data = (guint8 *) g_steal_pointer (&writer->parent.data);
|
||||||
if (!writer->owned)
|
if (!writer->owned)
|
||||||
data = g_memdup2 (data, writer->parent.size);
|
data = g_memdup2 (data, writer->parent.size);
|
||||||
writer->parent.data = NULL;
|
|
||||||
fpi_byte_writer_reset (writer);
|
fpi_byte_writer_reset (writer);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|||||||
@@ -111,6 +111,17 @@ fpi_byte_writer_set_pos (FpiByteWriter *writer, guint pos)
|
|||||||
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), pos);
|
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
fpi_byte_writer_change_pos (FpiByteWriter *writer, gint pos)
|
||||||
|
{
|
||||||
|
pos = fpi_byte_writer_get_pos (writer) + pos;
|
||||||
|
|
||||||
|
if (pos < 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return fpi_byte_reader_set_pos (FPI_BYTE_READER (writer), pos);
|
||||||
|
}
|
||||||
|
|
||||||
static inline guint
|
static inline guint
|
||||||
fpi_byte_writer_get_size (const FpiByteWriter *writer)
|
fpi_byte_writer_get_size (const FpiByteWriter *writer)
|
||||||
{
|
{
|
||||||
@@ -407,4 +418,7 @@ fpi_byte_writer_fill_inline (FpiByteWriter * writer, guint8 value, guint size)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiByteWriter, fpi_byte_writer_free);
|
||||||
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (FpiByteWriter, fpi_byte_writer_reset);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
+29
-15
@@ -117,6 +117,10 @@ fpi_device_retry_new (FpDeviceRetry error)
|
|||||||
msg = "Please try again after removing the finger first.";
|
msg = "Please try again after removing the finger first.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FP_DEVICE_RETRY_TOO_FAST:
|
||||||
|
msg = "The swipe was too fast, please try again.";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_warning ("Unsupported error, returning general error instead!");
|
g_warning ("Unsupported error, returning general error instead!");
|
||||||
error = FP_DEVICE_RETRY_GENERAL;
|
error = FP_DEVICE_RETRY_GENERAL;
|
||||||
@@ -186,6 +190,9 @@ fpi_device_error_new (FpDeviceError error)
|
|||||||
|
|
||||||
case FP_DEVICE_ERROR_TOO_HOT:
|
case FP_DEVICE_ERROR_TOO_HOT:
|
||||||
msg = "Device disabled to prevent overheating.";
|
msg = "Device disabled to prevent overheating.";
|
||||||
|
|
||||||
|
case FP_DEVICE_ERROR_UNTRUSTED:
|
||||||
|
msg = "Could not verify integrity of the device, it cannot be trusted!";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1042,8 +1049,6 @@ fp_device_task_return_in_idle_cb (gpointer user_data)
|
|||||||
static void
|
static void
|
||||||
fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
|
fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
|
||||||
{
|
{
|
||||||
if (data->result)
|
|
||||||
{
|
|
||||||
switch (data->type)
|
switch (data->type)
|
||||||
{
|
{
|
||||||
case FP_DEVICE_TASK_RETURN_INT:
|
case FP_DEVICE_TASK_RETURN_INT:
|
||||||
@@ -1065,11 +1070,20 @@ fpi_device_task_return_data_free (FpDeviceTaskReturnData *data)
|
|||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
g_object_unref (data->device);
|
g_object_unref (data->device);
|
||||||
g_free (data);
|
g_free (data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_device_return_task_in_idle:
|
||||||
|
* @device: The #FpDevice
|
||||||
|
* @return_type: The #FpDeviceTaskReturnType of @return_data
|
||||||
|
* @return_data: (nullable) (transfer full): The data to return.
|
||||||
|
*
|
||||||
|
* Completes a #FpDevice task in an idle source, stealing the ownership of
|
||||||
|
* the passed @returned_data.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
fpi_device_return_task_in_idle (FpDevice *device,
|
fpi_device_return_task_in_idle (FpDevice *device,
|
||||||
FpDeviceTaskReturnType return_type,
|
FpDeviceTaskReturnType return_type,
|
||||||
@@ -1101,7 +1115,7 @@ fpi_device_return_task_in_idle (FpDevice *device,
|
|||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @device_id: Unique ID for the device or %NULL
|
* @device_id: Unique ID for the device or %NULL
|
||||||
* @device_name: Human readable name or %NULL for driver name
|
* @device_name: Human readable name or %NULL for driver name
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing probe operation. If error is %NULL success is assumed.
|
* Finish an ongoing probe operation. If error is %NULL success is assumed.
|
||||||
*/
|
*/
|
||||||
@@ -1147,7 +1161,7 @@ fpi_device_probe_complete (FpDevice *device,
|
|||||||
/**
|
/**
|
||||||
* fpi_device_open_complete:
|
* fpi_device_open_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing open operation. If error is %NULL success is assumed.
|
* Finish an ongoing open operation. If error is %NULL success is assumed.
|
||||||
*/
|
*/
|
||||||
@@ -1174,7 +1188,7 @@ fpi_device_open_complete (FpDevice *device, GError *error)
|
|||||||
/**
|
/**
|
||||||
* fpi_device_close_complete:
|
* fpi_device_close_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing close operation. If error is %NULL success is assumed.
|
* Finish an ongoing close operation. If error is %NULL success is assumed.
|
||||||
*/
|
*/
|
||||||
@@ -1226,7 +1240,7 @@ fpi_device_close_complete (FpDevice *device, GError *error)
|
|||||||
* fpi_device_enroll_complete:
|
* fpi_device_enroll_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @print: (nullable) (transfer full): The #FpPrint or %NULL on failure
|
* @print: (nullable) (transfer full): The #FpPrint or %NULL on failure
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing enroll operation. The #FpPrint can be stored by the
|
* Finish an ongoing enroll operation. The #FpPrint can be stored by the
|
||||||
* caller for later verification.
|
* caller for later verification.
|
||||||
@@ -1355,7 +1369,7 @@ fpi_device_verify_complete (FpDevice *device,
|
|||||||
/**
|
/**
|
||||||
* fpi_device_identify_complete:
|
* fpi_device_identify_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing identify operation.
|
* Finish an ongoing identify operation.
|
||||||
*
|
*
|
||||||
@@ -1421,7 +1435,7 @@ fpi_device_identify_complete (FpDevice *device,
|
|||||||
* fpi_device_capture_complete:
|
* fpi_device_capture_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @image: The #FpImage, or %NULL on error
|
* @image: The #FpImage, or %NULL on error
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing capture operation.
|
* Finish an ongoing capture operation.
|
||||||
*/
|
*/
|
||||||
@@ -1468,7 +1482,7 @@ fpi_device_capture_complete (FpDevice *device,
|
|||||||
/**
|
/**
|
||||||
* fpi_device_delete_complete:
|
* fpi_device_delete_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing delete operation.
|
* Finish an ongoing delete operation.
|
||||||
*/
|
*/
|
||||||
@@ -1497,7 +1511,7 @@ fpi_device_delete_complete (FpDevice *device,
|
|||||||
* fpi_device_list_complete:
|
* fpi_device_list_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @prints: (element-type FpPrint) (transfer container): Possibly empty array of prints or %NULL on error
|
* @prints: (element-type FpPrint) (transfer container): Possibly empty array of prints or %NULL on error
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing list operation.
|
* Finish an ongoing list operation.
|
||||||
*
|
*
|
||||||
@@ -1775,7 +1789,7 @@ fpi_device_suspend_completed (FpDevice *device)
|
|||||||
/**
|
/**
|
||||||
* fpi_device_suspend_complete:
|
* fpi_device_suspend_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish a suspend request. Only return a %NULL error if suspend has been
|
* Finish a suspend request. Only return a %NULL error if suspend has been
|
||||||
* correctly configured and the current action as returned by
|
* correctly configured and the current action as returned by
|
||||||
@@ -1826,7 +1840,7 @@ fpi_device_suspend_complete (FpDevice *device,
|
|||||||
/**
|
/**
|
||||||
* fpi_device_resume_complete:
|
* fpi_device_resume_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish a resume request.
|
* Finish a resume request.
|
||||||
*/
|
*/
|
||||||
@@ -1854,7 +1868,7 @@ fpi_device_resume_complete (FpDevice *device,
|
|||||||
/**
|
/**
|
||||||
* fpi_device_clear_storage_complete:
|
* fpi_device_clear_storage_complete:
|
||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @error: The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Finish an ongoing clear_storage operation.
|
* Finish an ongoing clear_storage operation.
|
||||||
*/
|
*/
|
||||||
@@ -1885,7 +1899,7 @@ fpi_device_clear_storage_complete (FpDevice *device,
|
|||||||
* @device: The #FpDevice
|
* @device: The #FpDevice
|
||||||
* @completed_stages: The number of stages that are completed at this point
|
* @completed_stages: The number of stages that are completed at this point
|
||||||
* @print: (transfer floating): The #FpPrint for the newly completed stage or %NULL on failure
|
* @print: (transfer floating): The #FpPrint for the newly completed stage or %NULL on failure
|
||||||
* @error: (transfer full): The #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Notify about the progress of the enroll operation. This is important for UI interaction.
|
* Notify about the progress of the enroll operation. This is important for UI interaction.
|
||||||
* The passed error may be used if a scan needs to be retried, use fpi_device_retry_new().
|
* The passed error may be used if a scan needs to be retried, use fpi_device_retry_new().
|
||||||
|
|||||||
+7
-30
@@ -23,7 +23,6 @@
|
|||||||
#include "fp-device.h"
|
#include "fp-device.h"
|
||||||
#include "fp-image.h"
|
#include "fp-image.h"
|
||||||
#include "fpi-print.h"
|
#include "fpi-print.h"
|
||||||
#include "tod/tod-macros.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FpiDeviceUdevSubtypeFlags:
|
* FpiDeviceUdevSubtypeFlags:
|
||||||
@@ -56,12 +55,6 @@ struct _FpIdEntry
|
|||||||
guint vid;
|
guint vid;
|
||||||
};
|
};
|
||||||
const gchar *virtual_envvar;
|
const gchar *virtual_envvar;
|
||||||
};
|
|
||||||
guint64 driver_data;
|
|
||||||
|
|
||||||
/* Elements added after TODv1 */
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
FpiDeviceUdevSubtypeFlags udev_types;
|
FpiDeviceUdevSubtypeFlags udev_types;
|
||||||
@@ -73,13 +66,7 @@ struct _FpIdEntry
|
|||||||
} hid_id;
|
} hid_id;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
guint64 driver_data;
|
||||||
/*< private >*/
|
|
||||||
/* padding for future expansion */
|
|
||||||
TOD_PADDING_ALIGNED (16,
|
|
||||||
sizeof (guint) * 2 +
|
|
||||||
sizeof (FpiDeviceUdevSubtypeFlags) +
|
|
||||||
sizeof (gpointer));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -160,11 +147,16 @@ struct _FpDeviceClass
|
|||||||
const gchar *full_name;
|
const gchar *full_name;
|
||||||
FpDeviceType type;
|
FpDeviceType type;
|
||||||
const FpIdEntry *id_table;
|
const FpIdEntry *id_table;
|
||||||
|
FpDeviceFeature features;
|
||||||
|
|
||||||
/* Defaults for device properties */
|
/* Defaults for device properties */
|
||||||
gint nr_enroll_stages;
|
gint nr_enroll_stages;
|
||||||
FpScanType scan_type;
|
FpScanType scan_type;
|
||||||
|
|
||||||
|
/* Simple device temperature model constants */
|
||||||
|
gint32 temp_hot_seconds;
|
||||||
|
gint32 temp_cold_seconds;
|
||||||
|
|
||||||
/* Callbacks */
|
/* Callbacks */
|
||||||
gint (*usb_discover) (GUsbDevice *usb_device);
|
gint (*usb_discover) (GUsbDevice *usb_device);
|
||||||
void (*probe) (FpDevice *device);
|
void (*probe) (FpDevice *device);
|
||||||
@@ -176,26 +168,11 @@ struct _FpDeviceClass
|
|||||||
void (*capture) (FpDevice *device);
|
void (*capture) (FpDevice *device);
|
||||||
void (*list) (FpDevice *device);
|
void (*list) (FpDevice *device);
|
||||||
void (*delete) (FpDevice * device);
|
void (*delete) (FpDevice * device);
|
||||||
|
void (*clear_storage) (FpDevice * device);
|
||||||
|
|
||||||
void (*cancel) (FpDevice *device);
|
void (*cancel) (FpDevice *device);
|
||||||
|
|
||||||
/* Class elements added after tod-v1 */
|
|
||||||
FpDeviceFeature features;
|
|
||||||
|
|
||||||
/* Simple device temperature model constants */
|
|
||||||
gint32 temp_hot_seconds;
|
|
||||||
gint32 temp_cold_seconds;
|
|
||||||
|
|
||||||
void (*clear_storage) (FpDevice * device);
|
|
||||||
void (*suspend) (FpDevice *device);
|
void (*suspend) (FpDevice *device);
|
||||||
void (*resume) (FpDevice *device);
|
void (*resume) (FpDevice *device);
|
||||||
|
|
||||||
/*< private >*/
|
|
||||||
/* padding for future expansion */
|
|
||||||
TOD_PADDING_ALIGNED8 (32,
|
|
||||||
sizeof (FpDeviceFeature) +
|
|
||||||
sizeof (gint32) * 2 +
|
|
||||||
sizeof (gpointer) * 3);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class);
|
void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class);
|
||||||
|
|||||||
@@ -565,7 +565,7 @@ fpi_image_device_retry_scan (FpImageDevice *self, FpDeviceRetry retry)
|
|||||||
/**
|
/**
|
||||||
* fpi_image_device_session_error:
|
* fpi_image_device_session_error:
|
||||||
* @self: a #FpImageDevice imaging fingerprint device
|
* @self: a #FpImageDevice imaging fingerprint device
|
||||||
* @error: The #GError to report
|
* @error: (nullable) (transfer full): The #GError to report.
|
||||||
*
|
*
|
||||||
* Report an error while interacting with the device. This effectively
|
* Report an error while interacting with the device. This effectively
|
||||||
* aborts the current ongoing action. Note that doing so will result in
|
* aborts the current ongoing action. Note that doing so will result in
|
||||||
@@ -624,7 +624,7 @@ fpi_image_device_session_error (FpImageDevice *self, GError *error)
|
|||||||
/**
|
/**
|
||||||
* fpi_image_device_activate_complete:
|
* fpi_image_device_activate_complete:
|
||||||
* @self: a #FpImageDevice imaging fingerprint device
|
* @self: a #FpImageDevice imaging fingerprint device
|
||||||
* @error: A #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Reports completion of device activation.
|
* Reports completion of device activation.
|
||||||
*/
|
*/
|
||||||
@@ -663,7 +663,7 @@ fpi_image_device_activate_complete (FpImageDevice *self, GError *error)
|
|||||||
/**
|
/**
|
||||||
* fpi_image_device_deactivate_complete:
|
* fpi_image_device_deactivate_complete:
|
||||||
* @self: a #FpImageDevice imaging fingerprint device
|
* @self: a #FpImageDevice imaging fingerprint device
|
||||||
* @error: A #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Reports completion of device deactivation.
|
* Reports completion of device deactivation.
|
||||||
*/
|
*/
|
||||||
@@ -690,7 +690,7 @@ fpi_image_device_deactivate_complete (FpImageDevice *self, GError *error)
|
|||||||
/**
|
/**
|
||||||
* fpi_image_device_open_complete:
|
* fpi_image_device_open_complete:
|
||||||
* @self: a #FpImageDevice imaging fingerprint device
|
* @self: a #FpImageDevice imaging fingerprint device
|
||||||
* @error: A #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Reports completion of open operation.
|
* Reports completion of open operation.
|
||||||
*/
|
*/
|
||||||
@@ -718,7 +718,7 @@ fpi_image_device_open_complete (FpImageDevice *self, GError *error)
|
|||||||
/**
|
/**
|
||||||
* fpi_image_device_close_complete:
|
* fpi_image_device_close_complete:
|
||||||
* @self: a #FpImageDevice imaging fingerprint device
|
* @self: a #FpImageDevice imaging fingerprint device
|
||||||
* @error: A #GError or %NULL on success
|
* @error: (nullable) (transfer full): The #GError or %NULL on success
|
||||||
*
|
*
|
||||||
* Reports completion of close operation.
|
* Reports completion of close operation.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -62,12 +62,12 @@
|
|||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FPI_IMAGE_DEVICE_STATE_INACTIVE,
|
FPI_IMAGE_DEVICE_STATE_INACTIVE,
|
||||||
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON,
|
|
||||||
FPI_IMAGE_DEVICE_STATE_CAPTURE,
|
|
||||||
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF,
|
|
||||||
FPI_IMAGE_DEVICE_STATE_ACTIVATING,
|
FPI_IMAGE_DEVICE_STATE_ACTIVATING,
|
||||||
FPI_IMAGE_DEVICE_STATE_DEACTIVATING,
|
FPI_IMAGE_DEVICE_STATE_DEACTIVATING,
|
||||||
FPI_IMAGE_DEVICE_STATE_IDLE,
|
FPI_IMAGE_DEVICE_STATE_IDLE,
|
||||||
|
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_ON,
|
||||||
|
FPI_IMAGE_DEVICE_STATE_CAPTURE,
|
||||||
|
FPI_IMAGE_DEVICE_STATE_AWAIT_FINGER_OFF,
|
||||||
} FpiImageDeviceState;
|
} FpiImageDeviceState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -114,10 +114,6 @@ struct _FpImageDeviceClass
|
|||||||
void (*change_state) (FpImageDevice *dev,
|
void (*change_state) (FpImageDevice *dev,
|
||||||
FpiImageDeviceState state);
|
FpiImageDeviceState state);
|
||||||
void (*deactivate) (FpImageDevice *dev);
|
void (*deactivate) (FpImageDevice *dev);
|
||||||
|
|
||||||
/*< private >*/
|
|
||||||
/* padding for future expansion */
|
|
||||||
TOD_PADDING (32, 0);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void fpi_image_device_set_bz3_threshold (FpImageDevice *self,
|
void fpi_image_device_set_bz3_threshold (FpImageDevice *self,
|
||||||
|
|||||||
@@ -21,11 +21,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "fp-image.h"
|
#include "fp-image.h"
|
||||||
#include "tod/tod-macros.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FpiImageFlags:
|
* FpiImageFlags:
|
||||||
* @FPI_IMAGE_NONE: no flag set
|
|
||||||
* @FPI_IMAGE_V_FLIPPED: the image is vertically flipped
|
* @FPI_IMAGE_V_FLIPPED: the image is vertically flipped
|
||||||
* @FPI_IMAGE_H_FLIPPED: the image is horizontally flipped
|
* @FPI_IMAGE_H_FLIPPED: the image is horizontally flipped
|
||||||
* @FPI_IMAGE_COLORS_INVERTED: the colours are inverted
|
* @FPI_IMAGE_COLORS_INVERTED: the colours are inverted
|
||||||
@@ -70,12 +68,8 @@ struct _FpImage
|
|||||||
guint8 *binarized;
|
guint8 *binarized;
|
||||||
|
|
||||||
GPtrArray *minutiae;
|
GPtrArray *minutiae;
|
||||||
/* Unused */
|
|
||||||
guint ref_count;
|
|
||||||
|
|
||||||
gboolean detection_in_progress;
|
gboolean detection_in_progress;
|
||||||
|
|
||||||
TOD_PADDING (32, sizeof (gboolean));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
gint fpi_std_sq_dev (const guint8 *buf,
|
gint fpi_std_sq_dev (const guint8 *buf,
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* FpiLog - Internal logging functions
|
||||||
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fpi-log.h"
|
||||||
|
|
||||||
|
#undef fp_dbg_hex_dump_bytes
|
||||||
|
#undef fp_dbg_hex_dump_gbytes
|
||||||
|
|
||||||
|
void
|
||||||
|
fp_dbg_hex_dump_bytes (const gchar *log_domain,
|
||||||
|
const guint8 *buf,
|
||||||
|
gsize len)
|
||||||
|
{
|
||||||
|
g_autoptr(GString) line = NULL;
|
||||||
|
|
||||||
|
line = g_string_new ("");
|
||||||
|
|
||||||
|
for (gint i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
g_string_append_printf (line, "%02x ", buf[i]);
|
||||||
|
if ((i + 1) % 16 == 0)
|
||||||
|
{
|
||||||
|
g_log (log_domain, G_LOG_LEVEL_DEBUG, "%s", line->str);
|
||||||
|
g_string_set_size (line, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line->len)
|
||||||
|
g_log (log_domain, G_LOG_LEVEL_DEBUG, "%s", line->str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fp_dbg_hex_dump_gbytes (const gchar *log_domain,
|
||||||
|
GBytes *gbytes)
|
||||||
|
{
|
||||||
|
gsize len = 0;
|
||||||
|
const guint8 *buf = g_bytes_get_data (gbytes, &len);
|
||||||
|
|
||||||
|
fp_dbg_hex_dump_bytes (log_domain, buf, len);
|
||||||
|
}
|
||||||
+35
-3
@@ -79,13 +79,16 @@
|
|||||||
*
|
*
|
||||||
* Uses fp_err() to print an error if the @condition is true.
|
* Uses fp_err() to print an error if the @condition is true.
|
||||||
*/
|
*/
|
||||||
#define BUG_ON(condition) G_STMT_START \
|
#define BUG_ON(condition) \
|
||||||
if (condition) { \
|
G_STMT_START \
|
||||||
|
if (condition) \
|
||||||
|
{ \
|
||||||
char *s; \
|
char *s; \
|
||||||
s = g_strconcat ("BUG: (", #condition, ")", NULL); \
|
s = g_strconcat ("BUG: (", #condition, ")", NULL); \
|
||||||
fp_err ("%s: %s() %s:%d", s, G_STRFUNC, __FILE__, __LINE__); \
|
fp_err ("%s: %s() %s:%d", s, G_STRFUNC, __FILE__, __LINE__); \
|
||||||
g_free (s); \
|
g_free (s); \
|
||||||
} G_STMT_END
|
} \
|
||||||
|
G_STMT_END
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BUG:
|
* BUG:
|
||||||
@@ -93,3 +96,32 @@
|
|||||||
* Same as BUG_ON() but is always true.
|
* Same as BUG_ON() but is always true.
|
||||||
*/
|
*/
|
||||||
#define BUG() BUG_ON (1)
|
#define BUG() BUG_ON (1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Custom-defined logging functions are wrapped in macros for convenience so
|
||||||
|
* that the caller does not have to pass G_LOG_DOMAIN every time.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void fp_dbg_hex_dump_bytes (const gchar *log_domain,
|
||||||
|
const guint8 *buf,
|
||||||
|
gsize len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_dbg_hex_dump_bytes:
|
||||||
|
* @buf: Bytes buffer to dump
|
||||||
|
* @len: Length of @buf to dump
|
||||||
|
*
|
||||||
|
* Prints hex dump of @buf to fp_dbg()
|
||||||
|
*/
|
||||||
|
#define fp_dbg_hex_dump_bytes(buf, len) fp_dbg_hex_dump_bytes (G_LOG_DOMAIN, buf, len)
|
||||||
|
|
||||||
|
void fp_dbg_hex_dump_gbytes (const gchar *log_domain,
|
||||||
|
GBytes *gbytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_dbg_hex_dump_gbytes:
|
||||||
|
* @gbytes: #GBytes to dump
|
||||||
|
*
|
||||||
|
* Prints hex dump of @gbytes to fp_dbg()
|
||||||
|
*/
|
||||||
|
#define fp_dbg_hex_dump_gbytes(gbytes) fp_dbg_hex_dump_gbytes (G_LOG_DOMAIN, gbytes)
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ G_BEGIN_DECLS
|
|||||||
* @FPI_PRINT_UNDEFINED: Undefined type, this happens prior to enrollment
|
* @FPI_PRINT_UNDEFINED: Undefined type, this happens prior to enrollment
|
||||||
* @FPI_PRINT_RAW: A raw print where the data is directly compared
|
* @FPI_PRINT_RAW: A raw print where the data is directly compared
|
||||||
* @FPI_PRINT_NBIS: NBIS minutiae comparison
|
* @FPI_PRINT_NBIS: NBIS minutiae comparison
|
||||||
|
* @FPI_PRINT_SDCP: Print from an SDCP conforming device
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FPI_PRINT_UNDEFINED = 0,
|
FPI_PRINT_UNDEFINED = 0,
|
||||||
FPI_PRINT_RAW,
|
FPI_PRINT_RAW,
|
||||||
FPI_PRINT_NBIS,
|
FPI_PRINT_NBIS,
|
||||||
|
FPI_PRINT_SDCP,
|
||||||
} FpiPrintType;
|
} FpiPrintType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,980 @@
|
|||||||
|
/*
|
||||||
|
* FpSdcpDevice - A base class for SDCP enabled devices
|
||||||
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FP_COMPONENT "sdcp_device"
|
||||||
|
#include "fpi-log.h"
|
||||||
|
|
||||||
|
#include "fpi-compat.h"
|
||||||
|
#include "fpi-print.h"
|
||||||
|
|
||||||
|
#include "fp-sdcp-device-private.h"
|
||||||
|
#include "fpi-sdcp.h"
|
||||||
|
#include "fpi-sdcp-device.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION: fpi-sdcp-device
|
||||||
|
* @title: Internal FpSdcpDevice
|
||||||
|
* @short_description: Internal SDCP device routines
|
||||||
|
*
|
||||||
|
* Internal SDCP handling routines. See #FpSdcpDevice for public routines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
G_DEFINE_BOXED_TYPE (FpiSdcpClaim, fpi_sdcp_claim, fpi_sdcp_claim_copy, fpi_sdcp_claim_free)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_claim_new:
|
||||||
|
*
|
||||||
|
* Create an empty #FpiSdcpClaim to provide to the base class.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): A newly created #FpiSdcpClaim
|
||||||
|
*/
|
||||||
|
FpiSdcpClaim *
|
||||||
|
fpi_sdcp_claim_new (void)
|
||||||
|
{
|
||||||
|
FpiSdcpClaim *res = NULL;
|
||||||
|
|
||||||
|
res = g_new0 (FpiSdcpClaim, 1);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_claim_free:
|
||||||
|
* @claim: a #FpiSdcpClaim
|
||||||
|
*
|
||||||
|
* Release the memory used by an #FpiSdcpClaim.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_claim_free (FpiSdcpClaim *claim)
|
||||||
|
{
|
||||||
|
g_return_if_fail (claim);
|
||||||
|
|
||||||
|
g_clear_pointer (&claim->model_certificate, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim->device_public_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim->firmware_public_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim->firmware_hash, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim->model_signature, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim->device_signature, g_bytes_unref);
|
||||||
|
|
||||||
|
g_free (claim);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_claim_copy:
|
||||||
|
* @other: The #FpiSdcpClaim to copy
|
||||||
|
*
|
||||||
|
* Create a (shallow) copy of a #FpiSdcpClaim.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): A newly created #FpiSdcpClaim
|
||||||
|
*/
|
||||||
|
FpiSdcpClaim *
|
||||||
|
fpi_sdcp_claim_copy (FpiSdcpClaim *other)
|
||||||
|
{
|
||||||
|
FpiSdcpClaim *res = NULL;
|
||||||
|
|
||||||
|
res = fpi_sdcp_claim_new ();
|
||||||
|
|
||||||
|
if (other->model_certificate)
|
||||||
|
res->model_certificate = g_bytes_ref (other->model_certificate);
|
||||||
|
if (other->device_public_key)
|
||||||
|
res->device_public_key = g_bytes_ref (other->device_public_key);
|
||||||
|
if (other->firmware_public_key)
|
||||||
|
res->firmware_public_key = g_bytes_ref (other->firmware_public_key);
|
||||||
|
if (other->firmware_hash)
|
||||||
|
res->firmware_hash = g_bytes_ref (other->firmware_hash);
|
||||||
|
if (other->model_signature)
|
||||||
|
res->model_signature = g_bytes_ref (other->model_signature);
|
||||||
|
if (other->device_signature)
|
||||||
|
res->device_signature = g_bytes_ref (other->device_signature);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manually redefine what G_DEFINE_* macro does */
|
||||||
|
static inline gpointer
|
||||||
|
fp_sdcp_device_get_instance_private (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *sdcp_class = g_type_class_peek_static (FP_TYPE_SDCP_DEVICE);
|
||||||
|
|
||||||
|
return G_STRUCT_MEMBER_P (self,
|
||||||
|
g_type_class_get_instance_private_offset (sdcp_class));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Example values from Microsoft's SDCP documentation to use when testing (FP_DEVICE_EMULATION=1) */
|
||||||
|
static const guchar test_host_private_key[] = {
|
||||||
|
0x84, 0x00, 0xed, 0x14, 0x57, 0x9c, 0xdf, 0x11, 0x58, 0x64, 0x77, 0xe8, 0x36, 0xe8, 0xcb, 0x52,
|
||||||
|
0x70, 0x84, 0x41, 0xc1, 0xc2, 0xa4, 0x47, 0xc2, 0x18, 0xc5, 0xbb, 0xc2, 0xd1, 0x18, 0xfb, 0xc7
|
||||||
|
};
|
||||||
|
static const guchar test_host_public_key[] = {
|
||||||
|
0x04, 0x52, 0xf0, 0x56, 0xff, 0xb9, 0xc6, 0x72, 0x86, 0x54, 0x77, 0x1a, 0x36, 0x29, 0xb7, 0x70,
|
||||||
|
0x76, 0x7b, 0x19, 0xa2, 0x10, 0x6a, 0x49, 0x16, 0xfb, 0x81, 0xba, 0x06, 0xef, 0x67, 0x97, 0xc4,
|
||||||
|
0xa3, 0xdf, 0x67, 0x2a, 0xde, 0x0e, 0x91, 0x16, 0xd1, 0xab, 0xe2, 0x78, 0xa8, 0x22, 0x3a, 0xbd,
|
||||||
|
0xe4, 0x95, 0x8d, 0x62, 0xd4, 0xff, 0x68, 0x82, 0x15, 0x9f, 0x06, 0x17, 0xc6, 0xf8, 0xce, 0x10,
|
||||||
|
0xbf
|
||||||
|
};
|
||||||
|
static const gchar test_host_random[] = {
|
||||||
|
0xd8, 0x77, 0x40, 0x3a, 0xbe, 0x82, 0xf4, 0xd9, 0x7e, 0x14, 0x48, 0xc5, 0x05, 0x2d, 0x83, 0xa5,
|
||||||
|
0x32, 0xa4, 0x5e, 0x56, 0xef, 0x04, 0x9c, 0xbb, 0xf9, 0x81, 0x13, 0x75, 0x20, 0xe7, 0x13, 0xbf
|
||||||
|
};
|
||||||
|
static const gchar test_reconnect_random[] = {
|
||||||
|
0x8a, 0x74, 0x51, 0xc1, 0xd3, 0xa8, 0xdc, 0xa1, 0xc1, 0x33, 0x0c, 0xa5, 0x0d, 0x73, 0x45, 0x4b,
|
||||||
|
0x35, 0x1a, 0x49, 0xf4, 0x6c, 0x8e, 0x9d, 0xce, 0xe1, 0x5c, 0x96, 0x4d, 0x29, 0x5c, 0x31, 0xc9
|
||||||
|
};
|
||||||
|
static const gchar test_identify_nonce[] = {
|
||||||
|
0x3a, 0x1b, 0x50, 0x6f, 0x5b, 0xec, 0x08, 0x90, 0x59, 0xac, 0xef, 0xb9, 0xb4, 0x4d, 0xfb, 0xde,
|
||||||
|
0xa7, 0xa5, 0x99, 0xee, 0x9a, 0xa2, 0x67, 0xe5, 0x25, 0x26, 0x64, 0xd6, 0x0b, 0x79, 0x80, 0x53
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FpiSdcpDevice */
|
||||||
|
|
||||||
|
/* Internal functions of FpSdcpDevice */
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_get_application_secret (FpSdcpDevice *self,
|
||||||
|
GBytes **application_secret)
|
||||||
|
{
|
||||||
|
GBytes *data = NULL;
|
||||||
|
|
||||||
|
g_return_if_fail (*application_secret == NULL);
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (self), "sdcp-data", &data, NULL);
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
*application_secret = g_steal_pointer (&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_set_application_secret (FpSdcpDevice *self,
|
||||||
|
GBytes *application_secret)
|
||||||
|
{
|
||||||
|
g_return_if_fail (application_secret);
|
||||||
|
|
||||||
|
g_object_set (G_OBJECT (self), "sdcp-data", application_secret, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_open (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
g_return_if_fail (fpi_device_get_current_action (FP_DEVICE (self)) == FPI_DEVICE_ACTION_OPEN);
|
||||||
|
|
||||||
|
cls->open (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_connect (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->host_private_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_public_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_random, g_bytes_unref);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") != 0)
|
||||||
|
{
|
||||||
|
/* SDCP Connect: 3.i. Generate host ephemeral ECDH key pair */
|
||||||
|
fpi_sdcp_generate_host_key (&priv->host_private_key, &priv->host_public_key, &error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_connect_complete (self,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SDCP Connect: 3.ii. Generate host random */
|
||||||
|
priv->host_random = fpi_sdcp_generate_random (&error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_connect_complete (self,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use Microsoft's SDCP documentation example values in emulation mode */
|
||||||
|
priv->host_private_key = g_bytes_new (test_host_private_key, sizeof (test_host_private_key));
|
||||||
|
priv->host_public_key = g_bytes_new (test_host_public_key, sizeof (test_host_public_key));
|
||||||
|
priv->host_random = g_bytes_new (test_host_random, sizeof (test_host_random));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SDCP Connect: 3.iii. Send the Connect message */
|
||||||
|
cls->connect (self);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_reconnect (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->reconnect_random, g_bytes_unref);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") != 0)
|
||||||
|
{
|
||||||
|
/* SDCP Reconnect: 2.i. Generate host random */
|
||||||
|
priv->reconnect_random = fpi_sdcp_generate_random (&error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_reconnect_complete (self, NULL, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use Microsoft's SDCP documentation example value in emulation mode */
|
||||||
|
priv->reconnect_random = g_bytes_new (test_reconnect_random, sizeof (test_reconnect_random));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SDCP Reconnect: 2.ii. Send the Reconnect message */
|
||||||
|
if (cls->reconnect)
|
||||||
|
cls->reconnect (self);
|
||||||
|
else
|
||||||
|
fpi_sdcp_device_connect (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_list (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
g_return_if_fail (fpi_device_get_current_action (FP_DEVICE (self)) == FPI_DEVICE_ACTION_LIST);
|
||||||
|
|
||||||
|
cls->list (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_enroll (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
FpPrint *print;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
g_return_if_fail (fpi_device_get_current_action (FP_DEVICE (self)) == FPI_DEVICE_ACTION_ENROLL);
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
g_return_if_fail (application_secret != NULL);
|
||||||
|
|
||||||
|
fpi_device_get_enroll_data (FP_DEVICE (self), &print);
|
||||||
|
|
||||||
|
fpi_print_set_device_stored (print, FALSE);
|
||||||
|
g_object_set (print, "fpi-data", NULL, NULL);
|
||||||
|
|
||||||
|
cls->enroll (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_identify (FpSdcpDevice *self)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
FpiDeviceAction action;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_IDENTIFY || action == FPI_DEVICE_ACTION_VERIFY);
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
g_return_if_fail (application_secret != NULL);
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
|
||||||
|
if (g_strcmp0 (g_getenv ("FP_DEVICE_EMULATION"), "1") != 0)
|
||||||
|
{
|
||||||
|
/* Generate a new nonce. */
|
||||||
|
priv->identify_nonce = fpi_sdcp_generate_random (&error);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_device_action_error (FP_DEVICE (self), error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use Microsoft's SDCP documentation example value in emulation mode */
|
||||||
|
priv->identify_nonce = g_bytes_new (test_identify_nonce, sizeof (test_identify_nonce));
|
||||||
|
}
|
||||||
|
|
||||||
|
cls->identify (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************/
|
||||||
|
/* Private API */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_open_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @error: A #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Reports completion of open operation. Responsible for triggering SDCP connect
|
||||||
|
* or reconnect as necessary.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_open_complete (FpSdcpDevice *self,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
|
||||||
|
/* Try a reconnect if implemented and we already have an application_secret */
|
||||||
|
if (cls->reconnect && application_secret)
|
||||||
|
fpi_sdcp_device_reconnect (self);
|
||||||
|
|
||||||
|
/* Connect if we don't already have an application_secret */
|
||||||
|
else if (!application_secret)
|
||||||
|
fpi_sdcp_device_connect (self);
|
||||||
|
|
||||||
|
/* Complete open if we are already connected */
|
||||||
|
else
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self), error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_sdcp_device_get_connect_data:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @host_random: (out) (transfer full): The host-generated random
|
||||||
|
* @host_public_key: (out) (transfer full): The host public key
|
||||||
|
*
|
||||||
|
* Get data required to connect to (i.e. open) the device securely.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_get_connect_data (FpSdcpDevice *self,
|
||||||
|
GBytes **host_random,
|
||||||
|
GBytes **host_public_key)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_return_if_fail (host_random != NULL);
|
||||||
|
g_return_if_fail (host_public_key != NULL);
|
||||||
|
g_return_if_fail (priv->host_random);
|
||||||
|
g_return_if_fail (priv->host_public_key);
|
||||||
|
|
||||||
|
*host_random = g_bytes_new_from_bytes (priv->host_random, 0,
|
||||||
|
g_bytes_get_size (priv->host_random));
|
||||||
|
*host_public_key = g_bytes_new_from_bytes (priv->host_public_key, 0,
|
||||||
|
g_bytes_get_size (priv->host_public_key));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_sdcp_device_get_reconnect_data:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @reconnect_random: (out) (transfer full): The host-generated random
|
||||||
|
*
|
||||||
|
* Get data required to reconnect to (i.e. open) to the device securely.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_get_reconnect_data (FpSdcpDevice *self,
|
||||||
|
GBytes **reconnect_random)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_return_if_fail (reconnect_random != NULL);
|
||||||
|
g_return_if_fail (priv->reconnect_random);
|
||||||
|
|
||||||
|
*reconnect_random = g_bytes_new_from_bytes (priv->reconnect_random, 0,
|
||||||
|
g_bytes_get_size (priv->reconnect_random));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_sdcp_device_get_identify_data:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @nonce: (out) (transfer full): A new host-generated nonce
|
||||||
|
*
|
||||||
|
* Get data required to identify a new print.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_get_identify_data (FpSdcpDevice *self,
|
||||||
|
GBytes **nonce)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_return_if_fail (nonce != NULL);
|
||||||
|
g_return_if_fail (priv->identify_nonce);
|
||||||
|
|
||||||
|
*nonce = g_bytes_new_from_bytes (priv->identify_nonce, 0,
|
||||||
|
g_bytes_get_size (priv->identify_nonce));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fp_sdcp_device_set_identify_data:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @nonce: A driver-specified nonce
|
||||||
|
*
|
||||||
|
* Sets data required to identify a new print.
|
||||||
|
*
|
||||||
|
* Most drivers should not use this function, but instead use the automatically
|
||||||
|
* generated values retrieved from fpi_sdcp_device_get_identify_data() when
|
||||||
|
* executing the device-specific Identify command.
|
||||||
|
*
|
||||||
|
* In cases where a device's Identify command does not accept a randomly
|
||||||
|
* generated nonce, this function can be used to override the randomly generated
|
||||||
|
* nonce to the nonce that was actually sent to the device.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_set_identify_data (FpSdcpDevice *self,
|
||||||
|
GBytes *nonce)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_return_if_fail (nonce != NULL);
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
|
||||||
|
priv->identify_nonce = g_steal_pointer (&nonce);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_connect_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @device_random: The device random
|
||||||
|
* @claim: The device #FpiSdcpClaim
|
||||||
|
* @mac: The MAC authenticating @claim
|
||||||
|
* @error: A #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Reports completion of connect operation. Responsible for performing SDCP key
|
||||||
|
* agreement, deriving secrets necessary for processing all other SDCP-related
|
||||||
|
* payloads, and verifying the device connection is trusted.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_connect_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *device_random,
|
||||||
|
FpiSdcpClaim *claim,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
FpiDeviceAction action;
|
||||||
|
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_OPEN);
|
||||||
|
g_return_if_fail (priv->host_private_key);
|
||||||
|
g_return_if_fail (priv->host_random);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (device_random || claim || mac)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&device_random, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim, fpi_sdcp_claim_free);
|
||||||
|
g_clear_pointer (&mac, g_bytes_unref);
|
||||||
|
fp_warn ("Driver provided SDCP Connect information but also reported error.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self), error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!device_random || !claim || !mac ||
|
||||||
|
(!claim->model_certificate || !claim->device_public_key || !claim->firmware_public_key ||
|
||||||
|
!claim->firmware_hash || !claim->model_signature || !claim->device_signature))
|
||||||
|
{
|
||||||
|
fp_dbg ("Driver did not provide all required information to callback; returning error instead.");
|
||||||
|
g_clear_pointer (&device_random, g_bytes_unref);
|
||||||
|
g_clear_pointer (&claim, fpi_sdcp_claim_free);
|
||||||
|
g_clear_pointer (&mac, g_bytes_unref);
|
||||||
|
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self),
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
||||||
|
"Driver called connect complete with "
|
||||||
|
"incomplete arguments"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Verify connect and store the application_secret */
|
||||||
|
if (!fpi_sdcp_verify_connect (priv->host_private_key,
|
||||||
|
priv->host_random,
|
||||||
|
device_random,
|
||||||
|
claim,
|
||||||
|
mac,
|
||||||
|
!cls->ignore_device_certificate,
|
||||||
|
!cls->ignore_device_signatures,
|
||||||
|
&application_secret,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self),
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_UNTRUSTED,
|
||||||
|
"SDCP Connect verification failed: %s",
|
||||||
|
error->message));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_sdcp_device_set_application_secret (self, application_secret);
|
||||||
|
|
||||||
|
/* Clear no longer needed private data */
|
||||||
|
g_clear_pointer (&priv->host_private_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_public_key, g_bytes_unref);
|
||||||
|
g_clear_pointer (&priv->host_random, g_bytes_unref);
|
||||||
|
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_reconnect_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @mac: The MAC authenticating @claim
|
||||||
|
* @error: A #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Reports completion of a reconnect (i.e. open) operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_reconnect_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
FpiDeviceAction action;
|
||||||
|
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_OPEN);
|
||||||
|
g_return_if_fail (priv->reconnect_random);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (mac)
|
||||||
|
{
|
||||||
|
fp_warn ("Driver provided a reconnect MAC but also reported an error.");
|
||||||
|
g_clear_pointer (&mac, g_bytes_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Silently try a normal connect instead. */
|
||||||
|
fpi_sdcp_device_connect (self);
|
||||||
|
}
|
||||||
|
else if (mac)
|
||||||
|
{
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
|
||||||
|
if (fpi_sdcp_verify_reconnect (application_secret, priv->reconnect_random, mac, &error))
|
||||||
|
{
|
||||||
|
fp_dbg ("SDCP Reconnect succeeded");
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fp_dbg ("SDCP Reconnect failed; doing a full connect.");
|
||||||
|
fpi_sdcp_device_connect (self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_device_open_complete (FP_DEVICE (self),
|
||||||
|
fpi_device_error_new_msg (FP_DEVICE_ERROR_GENERAL,
|
||||||
|
"Driver called reconnect complete with wrong arguments"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear no longer needed private data */
|
||||||
|
g_clear_pointer (&priv->reconnect_random, g_bytes_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_list_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @ids: A #GPtrArray of #GBytes of each SDCP enrollment ID stored on the device
|
||||||
|
* @error: A #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Convenience function to create the minimally required #FpPrint list for
|
||||||
|
* #FpSdcpDevice prints using the provided @ids, then uses that #FpPrint list to
|
||||||
|
* report completion of the list operation.
|
||||||
|
*
|
||||||
|
* If the device provides additional attributes that should be stored on each
|
||||||
|
* #FpPrint as part of the list operation, a #GPtrArray of #FpPrint can instead
|
||||||
|
* be created with the additional attributes and fpi_device_list_complete() can
|
||||||
|
* be used instead of this function.
|
||||||
|
*
|
||||||
|
* Please note that the @ids array will be freed using g_ptr_array_unref() and
|
||||||
|
* the elements are destroyed automatically. As such, you must use
|
||||||
|
* g_ptr_array_new_with_free_func() with `(GDestroyNotify) g_bytes_unref` as the
|
||||||
|
* free func when creating the #GPtrArray.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_list_complete (FpSdcpDevice *self,
|
||||||
|
GPtrArray *ids,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
g_autoptr(GPtrArray) prints = NULL;
|
||||||
|
gint prints_len = 0;
|
||||||
|
FpiDeviceAction action;
|
||||||
|
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_LIST);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_device_list_complete (FP_DEVICE (self), NULL, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prints = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
|
|
||||||
|
/* Allow an empty array (prints_len=0) but if ids has been passed, use it */
|
||||||
|
if (ids)
|
||||||
|
prints_len = ids->len;
|
||||||
|
|
||||||
|
for (gint i = 0; i < prints_len; i++)
|
||||||
|
{
|
||||||
|
FpPrint *print = fp_print_new (FP_DEVICE (self));
|
||||||
|
fpi_print_set_type (print, FPI_PRINT_SDCP);
|
||||||
|
fpi_print_set_device_stored (print, FALSE);
|
||||||
|
fpi_sdcp_device_set_print_id (print, g_ptr_array_index (ids, i));
|
||||||
|
g_ptr_array_add (prints, g_object_ref_sink (print));
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_device_list_complete (FP_DEVICE (self), g_steal_pointer (&prints), NULL);
|
||||||
|
|
||||||
|
g_clear_pointer (&ids, g_ptr_array_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_enroll_commit:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @nonce: The device generated nonce
|
||||||
|
* @error: a #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Called when the print is ready to be committed to device memory.
|
||||||
|
* During enrollment, fpi_device_enroll_progress() must be called for each
|
||||||
|
* successful stage before the print can be committed.
|
||||||
|
* The @nonce generated by the device-specific EnrollmentNonce response must be
|
||||||
|
* provided in order for the enrollment ID to be generated.
|
||||||
|
* The driver's enroll_commit() vfunc will be triggered upon successfully
|
||||||
|
* generating the enrollment ID.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_enroll_commit (FpSdcpDevice *self,
|
||||||
|
GBytes *nonce,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpSdcpDeviceClass *cls = FP_SDCP_DEVICE_GET_CLASS (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
GBytes *id = NULL;
|
||||||
|
FpPrint *print;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
g_return_if_fail (fpi_device_get_current_action (FP_DEVICE (self)) == FPI_DEVICE_ACTION_ENROLL);
|
||||||
|
g_return_if_fail (nonce != NULL);
|
||||||
|
|
||||||
|
fpi_device_get_enroll_data (FP_DEVICE (self), &print);
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
|
||||||
|
id = fpi_sdcp_generate_enrollment_id (application_secret, nonce, &error);
|
||||||
|
if (!id || error)
|
||||||
|
{
|
||||||
|
fp_warn ("Could not generate SDCP enrollment ID");
|
||||||
|
fpi_device_enroll_complete (FP_DEVICE (self), NULL, error);
|
||||||
|
g_object_set (print, "fpi-data", NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set to true once committed */
|
||||||
|
fpi_print_set_device_stored (print, FALSE);
|
||||||
|
|
||||||
|
/* Attach the ID to the print */
|
||||||
|
fpi_sdcp_device_set_print_id (print, id);
|
||||||
|
|
||||||
|
cls->enroll_commit (self, id);
|
||||||
|
|
||||||
|
g_clear_pointer (&id, g_bytes_unref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_enroll_commit_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @error: a #GError or %NULL on success
|
||||||
|
*
|
||||||
|
* Called when device has committed the given print to memory.
|
||||||
|
* This finalizes the enroll operation.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_enroll_commit_complete (FpSdcpDevice *self,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
g_autoptr(GBytes) id = NULL;
|
||||||
|
FpPrint *print;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
g_return_if_fail (fpi_device_get_current_action (FP_DEVICE (self)) == FPI_DEVICE_ACTION_ENROLL);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
fpi_device_enroll_complete (FP_DEVICE (self), NULL, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_device_get_enroll_data (FP_DEVICE (self), &print);
|
||||||
|
|
||||||
|
fpi_sdcp_device_get_print_id (print, &id);
|
||||||
|
if (!id)
|
||||||
|
{
|
||||||
|
g_error ("Inconsistent state; the print must have the enrolled ID attached at this point");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_print_set_type (print, FPI_PRINT_SDCP);
|
||||||
|
fpi_print_set_device_stored (print, TRUE);
|
||||||
|
|
||||||
|
fpi_device_enroll_complete (FP_DEVICE (self), g_object_ref (print), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_identify_retry:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @error: a #GError containing the retry condition
|
||||||
|
*
|
||||||
|
* Called when the device requires the finger to be presented again.
|
||||||
|
* This should not be called for a verified no-match, it should only
|
||||||
|
* be called if e.g. the finger was not centered properly or similar.
|
||||||
|
*
|
||||||
|
* Effectively this simply raises the error up. This function exists
|
||||||
|
* to bridge the difference in semantics that SDPC has from how
|
||||||
|
* libfprint works internally.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_identify_retry (FpSdcpDevice *self,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpiDeviceAction action;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_IDENTIFY || action == FPI_DEVICE_ACTION_VERIFY);
|
||||||
|
|
||||||
|
if (action == FPI_DEVICE_ACTION_VERIFY)
|
||||||
|
fpi_device_verify_report (FP_DEVICE (self), FPI_MATCH_ERROR, NULL, error);
|
||||||
|
else if (action == FPI_DEVICE_ACTION_IDENTIFY)
|
||||||
|
fpi_device_identify_report (FP_DEVICE (self), NULL, NULL, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_identify_complete:
|
||||||
|
* @self: a #FpSdcpDevice fingerprint device
|
||||||
|
* @id: (transfer none): the ID as reported by the device
|
||||||
|
* @mac: (transfer none): MAC authenticating the message
|
||||||
|
* @error: (transfer full): #GError if an error occured
|
||||||
|
*
|
||||||
|
* Called when device is done with the identification routine. The
|
||||||
|
* returned ID may be %NULL if none of the in-device templates matched.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_identify_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *id,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error)
|
||||||
|
{
|
||||||
|
FpSdcpDevicePrivate *priv = fp_sdcp_device_get_instance_private (self);
|
||||||
|
|
||||||
|
g_autoptr(GBytes) application_secret = NULL;
|
||||||
|
FpPrint *identified_print;
|
||||||
|
FpiDeviceAction action;
|
||||||
|
|
||||||
|
g_return_if_fail (FP_IS_SDCP_DEVICE (self));
|
||||||
|
action = fpi_device_get_current_action (FP_DEVICE (self));
|
||||||
|
|
||||||
|
g_return_if_fail (action == FPI_DEVICE_ACTION_IDENTIFY || action == FPI_DEVICE_ACTION_VERIFY);
|
||||||
|
g_return_if_fail (priv->identify_nonce);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
fpi_device_action_error (FP_DEVICE (self), error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No error and no valid id/mac provided means that there was no match from the device */
|
||||||
|
if (!id || !mac || g_bytes_get_size (id) != SDCP_ENROLLMENT_ID_SIZE ||
|
||||||
|
g_bytes_get_size (mac) != SDCP_MAC_SIZE)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
if (action == FPI_DEVICE_ACTION_VERIFY)
|
||||||
|
{
|
||||||
|
fpi_device_verify_report (FP_DEVICE (self), FPI_MATCH_FAIL, NULL, NULL);
|
||||||
|
fpi_device_verify_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fpi_device_identify_report (FP_DEVICE (self), NULL, NULL, NULL);
|
||||||
|
fpi_device_identify_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fpi_sdcp_device_get_application_secret (self, &application_secret);
|
||||||
|
|
||||||
|
if (!fpi_sdcp_verify_identify (application_secret, priv->identify_nonce, id, mac, &error))
|
||||||
|
{
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
fpi_device_action_error (FP_DEVICE (self), error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear no longer needed private data */
|
||||||
|
g_clear_pointer (&priv->identify_nonce, g_bytes_unref);
|
||||||
|
|
||||||
|
/* Create a new print */
|
||||||
|
identified_print = fp_print_new (FP_DEVICE (self));
|
||||||
|
|
||||||
|
fpi_print_set_type (identified_print, FPI_PRINT_SDCP);
|
||||||
|
|
||||||
|
/* Set to true once committed */
|
||||||
|
fpi_print_set_device_stored (identified_print, FALSE);
|
||||||
|
|
||||||
|
/* Attach the ID to the print */
|
||||||
|
fpi_sdcp_device_set_print_id (identified_print, id);
|
||||||
|
|
||||||
|
|
||||||
|
/* The surrounding API expects a match/no-match against a given set. */
|
||||||
|
if (action == FPI_DEVICE_ACTION_VERIFY)
|
||||||
|
{
|
||||||
|
FpPrint *print;
|
||||||
|
|
||||||
|
fpi_device_get_verify_data (FP_DEVICE (self), &print);
|
||||||
|
|
||||||
|
if (fp_print_equal (print, identified_print))
|
||||||
|
fpi_device_verify_report (FP_DEVICE (self), FPI_MATCH_SUCCESS, identified_print, NULL);
|
||||||
|
else
|
||||||
|
fpi_device_verify_report (FP_DEVICE (self), FPI_MATCH_FAIL, identified_print, NULL);
|
||||||
|
|
||||||
|
fpi_device_verify_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GPtrArray *prints;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
fpi_device_get_identify_data (FP_DEVICE (self), &prints);
|
||||||
|
|
||||||
|
for (i = 0; i < prints->len; i++)
|
||||||
|
{
|
||||||
|
FpPrint *print = g_ptr_array_index (prints, i);
|
||||||
|
|
||||||
|
if (fp_print_equal (print, identified_print))
|
||||||
|
{
|
||||||
|
fpi_device_identify_report (FP_DEVICE (self), print, identified_print, NULL);
|
||||||
|
fpi_device_identify_complete (FP_DEVICE (self), NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print wasn't in database. */
|
||||||
|
fpi_device_identify_report (FP_DEVICE (self), NULL, identified_print, NULL);
|
||||||
|
fpi_device_identify_complete (FP_DEVICE (self), NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_get_print_id:
|
||||||
|
* @print: an SDCP device #FpPrint
|
||||||
|
* @id: (out) (transfer full): the ID gotten from the @print data
|
||||||
|
*
|
||||||
|
* Gets the SDCP enrollment ID from the @print data.
|
||||||
|
*
|
||||||
|
* The returned @id may be %NULL if the data was not set or in the wrong format.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_get_print_id (FpPrint *print,
|
||||||
|
GBytes **id)
|
||||||
|
{
|
||||||
|
g_autoptr(GVariant) id_var = NULL;
|
||||||
|
g_autoptr(GVariant) data = NULL;
|
||||||
|
const guint8 *id_data;
|
||||||
|
gsize id_len;
|
||||||
|
|
||||||
|
g_return_if_fail (print);
|
||||||
|
g_return_if_fail (*id == NULL);
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (print), "fpi-data", &data, NULL);
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
fp_warn ("SDCP print data has not been set.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_variant_check_format_string (data, "(@ay)", FALSE))
|
||||||
|
{
|
||||||
|
fp_warn ("SDCP print data is not in expected format.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_variant_get (data, "(@ay)", &id_var);
|
||||||
|
|
||||||
|
id_data = g_variant_get_fixed_array (id_var, &id_len, sizeof (guint8));
|
||||||
|
|
||||||
|
*id = g_bytes_new (id_data, id_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_device_set_print_id:
|
||||||
|
* @print: an SDCP device #FpPrint
|
||||||
|
* @id: the ID to set in the @print data
|
||||||
|
*
|
||||||
|
* Sets the SDCP enrollment ID in the @print data.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
fpi_sdcp_device_set_print_id (FpPrint *print,
|
||||||
|
GBytes *id)
|
||||||
|
{
|
||||||
|
GVariant *id_var;
|
||||||
|
GVariant *data;
|
||||||
|
|
||||||
|
g_return_if_fail (print);
|
||||||
|
g_return_if_fail (id);
|
||||||
|
|
||||||
|
id_var = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
||||||
|
g_bytes_get_data (id, NULL),
|
||||||
|
g_bytes_get_size (id),
|
||||||
|
1);
|
||||||
|
data = g_variant_new ("(@ay)", id_var);
|
||||||
|
|
||||||
|
g_object_set (G_OBJECT (print), "fpi-data", data, NULL);
|
||||||
|
}
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
* FpSdcpDevice - A base class for SDCP enabled devices
|
||||||
|
* Copyright (C) 2020 Benjamin Berg <bberg@redhat.com>
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "fpi-device.h"
|
||||||
|
|
||||||
|
#include "fp-sdcp-device.h"
|
||||||
|
|
||||||
|
#define SDCP_PUBLIC_KEY_SIZE 65
|
||||||
|
#define SDCP_APPLICATION_SECRET_SIZE 32
|
||||||
|
#define SDCP_RANDOM_SIZE 32
|
||||||
|
#define SDCP_MAC_SIZE 32
|
||||||
|
#define SDCP_NONCE_SIZE 32
|
||||||
|
#define SDCP_ENROLLMENT_ID_SIZE 32
|
||||||
|
#define SDCP_SIGNATURE_SIZE 64
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FpiSdcpClaim:
|
||||||
|
* @model_certificate: Microsoft-issued per-model certificate encoded in x509
|
||||||
|
* ASN.1 DER format (`cert_m`)
|
||||||
|
* @device_public_key: The per-device ECDSA public key (`pk_d`)
|
||||||
|
* @firmware_public_key: The ephemeral public key generated by the device
|
||||||
|
* firmware (`pk_f`)
|
||||||
|
* @firmware_hash: Hash of the firmware and firmware public key (`h_f`)
|
||||||
|
* @model_signature: Device public key signed by the model key (`s_m`)
|
||||||
|
* @device_signature: Firmware hash and public key signed by the device private
|
||||||
|
* key (`s_d`)
|
||||||
|
*
|
||||||
|
* Structure to hold the claim as produced by the device during a secure
|
||||||
|
* connect. See the SDCP specification for more details.
|
||||||
|
*
|
||||||
|
* Note all of these may simply be memory views into a larger #GBytes created
|
||||||
|
* using g_bytes_new_from_bytes().
|
||||||
|
*/
|
||||||
|
struct _FpiSdcpClaim
|
||||||
|
{
|
||||||
|
/*< public >*/
|
||||||
|
GBytes *model_certificate; /* cert_m */
|
||||||
|
GBytes *device_public_key; /* pk_d */
|
||||||
|
GBytes *firmware_public_key; /* pk_f */
|
||||||
|
GBytes *firmware_hash; /* h_f */
|
||||||
|
GBytes *model_signature; /* s_m */
|
||||||
|
GBytes *device_signature; /* s_d */
|
||||||
|
};
|
||||||
|
typedef struct _FpiSdcpClaim FpiSdcpClaim;
|
||||||
|
|
||||||
|
GType fpi_sdcp_claim_get_type (void) G_GNUC_CONST;
|
||||||
|
FpiSdcpClaim *fpi_sdcp_claim_new (void);
|
||||||
|
FpiSdcpClaim *fpi_sdcp_claim_copy (FpiSdcpClaim *other);
|
||||||
|
void fpi_sdcp_claim_free (FpiSdcpClaim *claim);
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FpiSdcpClaim, fpi_sdcp_claim_free)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FpSdcpDeviceClass:
|
||||||
|
* @ignore_device_certificate: Set to %TRUE to skip validating the device's
|
||||||
|
* #FpiSdcpClaim.model_certificate against the SDCP truststore.
|
||||||
|
* @ignore_device_signatures: Set to %TRUE to skip verifying the device's
|
||||||
|
* #FpiSdcpClaim.model_signature and #FpiSdcpClaim.device_signature.
|
||||||
|
* @open: Open the device. Similar to #FpDeviceClass.open except that
|
||||||
|
* completion with fpi_sdcp_device_open_complete() will also take care of
|
||||||
|
* executing @connect and @reconnect as necessary.
|
||||||
|
* @connect: Establish SDCP connection.
|
||||||
|
* @reconnect: Perform a faster reconnect. Drivers do not need to provide this
|
||||||
|
* function. If reconnect fails, then a normal connect will be tried.
|
||||||
|
* @list: List prints stored on the device. The driver must create a #GPtrArray
|
||||||
|
* of #GBytes with each enrollment ID stored on the device and use it to call
|
||||||
|
* fpi_sdcp_device_list_complete() in order to complete the operation.
|
||||||
|
* @enroll: Start the enrollment procedure and capture all samples. The driver
|
||||||
|
* must report enrollment progress using fpi_device_enroll_progress(). It
|
||||||
|
* should also store available metadata about the print in device memory. The
|
||||||
|
* driver must call fpi_sdcp_device_enroll_commit() when all enrollment stages
|
||||||
|
* are complete and the print is ready to be commited to the device.
|
||||||
|
* @enroll_commit: Commit the newly-enrolled print to the device memory using
|
||||||
|
* the passed id. id may be %NULL, in which case the driver must abort the
|
||||||
|
* enrollment process. id is owned by the base class and remains valid
|
||||||
|
* throughout the operation. On completion, the driver must call
|
||||||
|
* fpi_sdcp_device_enroll_commit_complete().
|
||||||
|
* @identify: Start identification process. On completion, the driver must call
|
||||||
|
* fpi_sdcp_device_identify_complete(). To request the user to retry the
|
||||||
|
* fpi_sdcp_device_identify_retry() function is used.
|
||||||
|
*
|
||||||
|
* These are the main entry points for drivers implementing SDCP.
|
||||||
|
*
|
||||||
|
* Drivers *must* eventually call the corresponding function to finish the
|
||||||
|
* operation.
|
||||||
|
*
|
||||||
|
* The following #FpDeviceClass entry points are also compatible and can be set
|
||||||
|
* on the #FpDeviceClass if supported for a given device:
|
||||||
|
* - #FpDeviceClass.probe
|
||||||
|
* - #FpDeviceClass.close
|
||||||
|
* - #FpDeviceClass.delete
|
||||||
|
* - #FpDeviceClass.clear_storage
|
||||||
|
* - #FpDeviceClass.cancel
|
||||||
|
* - #FpDeviceClass.suspend
|
||||||
|
* - #FpDeviceClass.resume
|
||||||
|
*
|
||||||
|
* XXX: Is the use of fpi_device_action_error() acceptable?
|
||||||
|
*
|
||||||
|
* Drivers *must* also handle cancellation properly for any long running
|
||||||
|
* operation (i.e. any operation that requires capturing). It is entirely fine
|
||||||
|
* to ignore cancellation requests for short operations (e.g. open/close).
|
||||||
|
*
|
||||||
|
* This API is solely intended for drivers. It is purely internal and neither
|
||||||
|
* API nor ABI stable.
|
||||||
|
*/
|
||||||
|
struct _FpSdcpDeviceClass
|
||||||
|
{
|
||||||
|
FpDeviceClass parent_class;
|
||||||
|
|
||||||
|
gboolean ignore_device_certificate;
|
||||||
|
gboolean ignore_device_signatures;
|
||||||
|
|
||||||
|
void (*open) (FpSdcpDevice *sdcp_device);
|
||||||
|
void (*connect) (FpSdcpDevice *sdcp_device);
|
||||||
|
void (*reconnect) (FpSdcpDevice *sdcp_device);
|
||||||
|
void (*list) (FpSdcpDevice *sdcp_device);
|
||||||
|
void (*enroll) (FpSdcpDevice *sdcp_device);
|
||||||
|
void (*enroll_commit) (FpSdcpDevice *sdcp_device,
|
||||||
|
GBytes *id);
|
||||||
|
void (*identify) (FpSdcpDevice *sdcp_device);
|
||||||
|
};
|
||||||
|
|
||||||
|
void fpi_sdcp_device_open_complete (FpSdcpDevice *self,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_get_connect_data (FpSdcpDevice *self,
|
||||||
|
GBytes **host_random,
|
||||||
|
GBytes **host_public_key);
|
||||||
|
void fpi_sdcp_device_connect_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *device_random,
|
||||||
|
FpiSdcpClaim *claim,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_get_reconnect_data (FpSdcpDevice *self,
|
||||||
|
GBytes **reconnect_random);
|
||||||
|
void fpi_sdcp_device_reconnect_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_list_complete (FpSdcpDevice *self,
|
||||||
|
GPtrArray *ids,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_enroll_commit (FpSdcpDevice *self,
|
||||||
|
GBytes *nonce,
|
||||||
|
GError *error);
|
||||||
|
void fpi_sdcp_device_enroll_commit_complete (FpSdcpDevice *self,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_get_identify_data (FpSdcpDevice *self,
|
||||||
|
GBytes **nonce);
|
||||||
|
void fpi_sdcp_device_set_identify_data (FpSdcpDevice *self,
|
||||||
|
GBytes *nonce);
|
||||||
|
void fpi_sdcp_device_identify_retry (FpSdcpDevice *self,
|
||||||
|
GError *error);
|
||||||
|
void fpi_sdcp_device_identify_complete (FpSdcpDevice *self,
|
||||||
|
GBytes *id,
|
||||||
|
GBytes *mac,
|
||||||
|
GError *error);
|
||||||
|
|
||||||
|
void fpi_sdcp_device_get_print_id (FpPrint *print,
|
||||||
|
GBytes **id);
|
||||||
|
void fpi_sdcp_device_set_print_id (FpPrint *print,
|
||||||
|
GBytes *id);
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* Secure Device Connection Protocol (SDCP) support implementation
|
||||||
|
* Copyright (C) 2025 Joshua Grisham <josh@joshuagrisham.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "fpi-compat.h"
|
||||||
|
|
||||||
|
#include "fpi-sdcp-device.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_generate_host_key:
|
||||||
|
* @private_key: (out) (transfer full): The host private key (sk_h)
|
||||||
|
* @public_key: (out) (transfer full): The host public key (pk_h)
|
||||||
|
* @error: (out): #GError in case the out values are %NULL
|
||||||
|
*
|
||||||
|
* Function to generate a new ephemeral ECDH key pair for use with SDCP.
|
||||||
|
**/
|
||||||
|
void fpi_sdcp_generate_host_key (GBytes **private_key,
|
||||||
|
GBytes **public_key,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_generate_random:
|
||||||
|
* @error: (out): #GError in case the return value is %NULL
|
||||||
|
*
|
||||||
|
* Returns: A new #GBytes with a secure random of length %SDCP_RANDOM_SIZE
|
||||||
|
**/
|
||||||
|
GBytes *fpi_sdcp_generate_random (GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_verify_connect:
|
||||||
|
* @host_private_key: Private key generated using fpi_sdcp_generate_host_key() (sk_h)
|
||||||
|
* @host_random: Random generated using fpi_sdcp_generate_random() (r_h)
|
||||||
|
* @device_random: The random provided in the device's ConnectResponse (r_d)
|
||||||
|
* @claim: #FpiSdcpClaim provided in the device's ConnectResponse (c)
|
||||||
|
* @mac: The MAC provided in the device's ConnectResponse (m)
|
||||||
|
* @validate_certificate: If the model certificate (cert_m) should be parsed and
|
||||||
|
* its trust chain validated as issued from Microsoft's well-known issuers
|
||||||
|
* @verify_signatures: If the model signature (s_m) and device signature (s_d)
|
||||||
|
* should be validated against the certificate and keys provided in the claim
|
||||||
|
* @application_secret: (out) (transfer full): A new #GBytes with the derived
|
||||||
|
* application secret (s) of length %SDCP_APPLICATION_SECRET_SIZE
|
||||||
|
* @error: (out): #GError in case the return value is %NULL
|
||||||
|
*
|
||||||
|
* High level function which internally handles the derivation of all necessary
|
||||||
|
* SDCP-related keys and secrets from the device's ConnectResponse and derives
|
||||||
|
* the application secret for use with all other SDCP-related functions.
|
||||||
|
*
|
||||||
|
* This function will also perform a validation of the ConnectResponse MAC and
|
||||||
|
* optionally perform additional verifications based on the provided
|
||||||
|
* @validate_certificate and @verify_signatures booleans. If any of these these
|
||||||
|
* validations fail then %NULL will be returned, indicating that the SDCP secure
|
||||||
|
* connection channel could not be established.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the @application_secret was successfully derived and the
|
||||||
|
* ConnectResponse has been successfully verified
|
||||||
|
**/
|
||||||
|
gboolean fpi_sdcp_verify_connect (GBytes *host_private_key,
|
||||||
|
GBytes *host_random,
|
||||||
|
GBytes *device_random,
|
||||||
|
FpiSdcpClaim *claim,
|
||||||
|
GBytes *mac,
|
||||||
|
gboolean validate_certificate,
|
||||||
|
gboolean verify_signatures,
|
||||||
|
GBytes **application_secret,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_verify_reconnect:
|
||||||
|
* @application_secret: The host's derived application secret (s)
|
||||||
|
* @random: The host-generated random sent to the device's Reconnect command (r)
|
||||||
|
* @mac: The MAC provided in the device's ReconnectResponse (m)
|
||||||
|
* @error: (out): #GError in case the return value is %FALSE
|
||||||
|
*
|
||||||
|
* Verifies the SDCP ReconnectResponse.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the ReconnectResponse is verified successfully
|
||||||
|
**/
|
||||||
|
gboolean fpi_sdcp_verify_reconnect (GBytes *application_secret,
|
||||||
|
GBytes *random,
|
||||||
|
GBytes *mac,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_verify_identify:
|
||||||
|
* @application_secret: The host's derived application secret (s)
|
||||||
|
* @nonce: The host-generated nonce sent to the device's Identify command (n)
|
||||||
|
* @id: The ID provided in the device's AuthorizedIdentity (id)
|
||||||
|
* @mac: The MAC provided in the device's AuthorizedIdentity (m)
|
||||||
|
* @error: (out): #GError in case the return value is %FALSE
|
||||||
|
*
|
||||||
|
* Verifies the SDCP ReconnectResponse.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the ReconnectResponse is verified successfully
|
||||||
|
**/
|
||||||
|
gboolean fpi_sdcp_verify_identify (GBytes *application_secret,
|
||||||
|
GBytes *nonce,
|
||||||
|
GBytes *id,
|
||||||
|
GBytes *mac,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fpi_sdcp_generate_enrollment_id:
|
||||||
|
* @application_secret: The host's derived application secret (s)
|
||||||
|
* @nonce: The nonce received from the device in response to the EnrollBegin
|
||||||
|
* command (n)
|
||||||
|
* @error: (out): #GError in case the return value is %NULL
|
||||||
|
*
|
||||||
|
* Generates a new id for use with the device's EnrollCommit command.
|
||||||
|
*
|
||||||
|
* Returns: A new #GBytes with the generated enrollment id of length
|
||||||
|
* %SDCP_ENROLLMENT_ID_SIZE
|
||||||
|
**/
|
||||||
|
GBytes *fpi_sdcp_generate_enrollment_id (GBytes *application_secret,
|
||||||
|
GBytes *nonce,
|
||||||
|
GError **error);
|
||||||
@@ -73,9 +73,6 @@ struct _FpiSpiTransfer
|
|||||||
/* Data free function */
|
/* Data free function */
|
||||||
GDestroyNotify free_buffer_wr;
|
GDestroyNotify free_buffer_wr;
|
||||||
GDestroyNotify free_buffer_rd;
|
GDestroyNotify free_buffer_rd;
|
||||||
|
|
||||||
/* padding for future expansion */
|
|
||||||
TOD_PADDING (32, 0);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType fpi_spi_transfer_get_type (void) G_GNUC_CONST;
|
GType fpi_spi_transfer_get_type (void) G_GNUC_CONST;
|
||||||
|
|||||||
@@ -765,7 +765,3 @@ fpi_ssm_spi_transfer_with_weak_pointer_cb (FpiSpiTransfer *transfer,
|
|||||||
|
|
||||||
fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error);
|
fpi_ssm_spi_transfer_cb (transfer, device, weak_ptr, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TOD_LIBRARY
|
|
||||||
#include "tod/tod-fpi-ssm.c"
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -102,9 +102,6 @@ struct _FpiUsbTransfer
|
|||||||
|
|
||||||
/* Data free function */
|
/* Data free function */
|
||||||
GDestroyNotify free_buffer;
|
GDestroyNotify free_buffer;
|
||||||
|
|
||||||
/* padding for future expansion */
|
|
||||||
TOD_PADDING (32, 0);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType fpi_usb_transfer_get_type (void) G_GNUC_CONST;
|
GType fpi_usb_transfer_get_type (void) G_GNUC_CONST;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user