mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-05-11 08:28:08 +02:00
refactor(validity): inline one-liner SSM wrappers into switch cases
Remove single-caller send/recv wrapper functions that just build a command buffer and call vcsfw_*_cmd_send or check status and call fpi_ssm_next_state. Move their bodies directly into the SSM switch cases to reduce indirection and code size (-579 lines net). Files: verify.c (7), enroll.c (33), fwext.c (10), pair.c (16), db.c (10 dead/single-caller functions removed). Tests updated to call validity_pack_new directly.
This commit is contained in:
parent
0594fbf7d7
commit
6510bcb178
8 changed files with 467 additions and 1046 deletions
|
|
@ -89,13 +89,6 @@ validity_record_children_clear (ValidityRecordChildren *children)
|
|||
* The caller must g_free() the result.
|
||||
* ================================================================ */
|
||||
|
||||
/* cmd 0x45: DB info */
|
||||
guint8 *
|
||||
validity_db_build_cmd_info (gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "b", VCSFW_CMD_DB_INFO);
|
||||
}
|
||||
|
||||
/* cmd 0x4B: Get user storage
|
||||
* Format: 0x4B | dbid(2LE) | name_len(2LE) | name(NUL-terminated) */
|
||||
guint8 *
|
||||
|
|
@ -124,42 +117,6 @@ validity_db_build_cmd_get_user (guint16 dbid,
|
|||
VCSFW_CMD_GET_USER, dbid, 0, 0);
|
||||
}
|
||||
|
||||
/* cmd 0x4A: Lookup user by identity within a storage
|
||||
* Format: 0x4A | 0(2LE) | storage_dbid(2LE) | identity_len(2LE) | identity */
|
||||
guint8 *
|
||||
validity_db_build_cmd_lookup_user (guint16 storage_dbid,
|
||||
const guint8 *identity,
|
||||
gsize identity_len,
|
||||
gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bhhhd",
|
||||
VCSFW_CMD_GET_USER,
|
||||
0, /* dbid = 0 (lookup by identity) */
|
||||
(int) storage_dbid,
|
||||
(int) identity_len,
|
||||
identity, identity_len);
|
||||
}
|
||||
|
||||
/* cmd 0x49: Get record value
|
||||
* Format: 0x49 | dbid(2LE) */
|
||||
guint8 *
|
||||
validity_db_build_cmd_get_record_value (guint16 dbid,
|
||||
gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bh",
|
||||
VCSFW_CMD_GET_RECORD_VALUE, dbid);
|
||||
}
|
||||
|
||||
/* cmd 0x46: Get record children
|
||||
* Format: 0x46 | dbid(2LE) */
|
||||
guint8 *
|
||||
validity_db_build_cmd_get_record_children (guint16 dbid,
|
||||
gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bh",
|
||||
VCSFW_CMD_GET_RECORD_CHILDREN, dbid);
|
||||
}
|
||||
|
||||
/* cmd 0x47: New record
|
||||
* Format: 0x47 | parent(2LE) | type(2LE) | storage(2LE) | data_len(2LE) | data */
|
||||
guint8 *
|
||||
|
|
@ -206,17 +163,6 @@ validity_db_build_cmd_create_enrollment (gboolean start,
|
|||
(guint32) (start ? 1 : 0));
|
||||
}
|
||||
|
||||
/* cmd 0x68: Enrollment update start
|
||||
* PY format: pack('<BLL', 0x68, key, 0) → 9 bytes: 0x68, key(4LE), 0(4LE) */
|
||||
guint8 *
|
||||
validity_db_build_cmd_enrollment_update_start (guint32 key,
|
||||
gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bww",
|
||||
VCSFW_CMD_ENROLLMENT_UPDATE_START,
|
||||
key, (guint32) 0);
|
||||
}
|
||||
|
||||
/* cmd 0x6B: Enrollment update (with template data)
|
||||
* Format: 0x6B | prev_data */
|
||||
guint8 *
|
||||
|
|
@ -229,58 +175,6 @@ validity_db_build_cmd_enrollment_update (const guint8 *prev_data,
|
|||
prev_data, prev_len);
|
||||
}
|
||||
|
||||
/* cmd 0x51: Get program status
|
||||
* Format: 0x51 | flags(4bytes)
|
||||
* extended=FALSE: 00000000, extended=TRUE: 00200000 */
|
||||
guint8 *
|
||||
validity_db_build_cmd_get_prg_status (gboolean extended,
|
||||
gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bw",
|
||||
VCSFW_CMD_GET_PRG_STATUS,
|
||||
(guint32) (extended ? 0x2000 : 0));
|
||||
}
|
||||
|
||||
/* cmd 0x04: Capture stop */
|
||||
guint8 *
|
||||
validity_db_build_cmd_capture_stop (gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "b", VCSFW_CMD_CAPTURE_STOP);
|
||||
}
|
||||
|
||||
/* cmd 0x5E: Match finger
|
||||
* Format: 0x5E | type(1) | 0xFF | stg_id(2LE) | usr_id(2LE) | 1(2LE) | 0(2LE) | 0(2LE)
|
||||
* type=2 matches against any storage/user */
|
||||
guint8 *
|
||||
validity_db_build_cmd_match_finger (gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bbbhhhhh",
|
||||
VCSFW_CMD_MATCH_FINGER,
|
||||
0x02, /* match type: match against any storage/user */
|
||||
0xFF, /* match against all subtypes */
|
||||
0, /* stg_id = any */
|
||||
0, /* usr_id = any */
|
||||
1, /* unknown, always 1 */
|
||||
0, 0);
|
||||
}
|
||||
|
||||
/* cmd 0x60: Get match result
|
||||
* Format: 0x60 | 00000000 */
|
||||
guint8 *
|
||||
validity_db_build_cmd_get_match_result (gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bw",
|
||||
VCSFW_CMD_GET_MATCH_RESULT, (guint32) 0);
|
||||
}
|
||||
|
||||
/* cmd 0x62: Match cleanup
|
||||
* Format: 0x62 | 00000000 */
|
||||
guint8 *
|
||||
validity_db_build_cmd_match_cleanup (gsize *out_len)
|
||||
{
|
||||
return validity_pack_new (out_len, "bw",
|
||||
VCSFW_CMD_MATCH_CLEANUP, (guint32) 0);
|
||||
}
|
||||
|
||||
/* ================================================================
|
||||
* Response parsers
|
||||
|
|
|
|||
|
|
@ -160,9 +160,6 @@ gboolean validity_parse_match_result (const guint8 *data,
|
|||
* All returned buffers are g_malloc'd and must be g_free'd by caller.
|
||||
* ================================================================ */
|
||||
|
||||
/* cmd 0x45: DB info */
|
||||
guint8 *validity_db_build_cmd_info (gsize *out_len);
|
||||
|
||||
/* cmd 0x4B: Get user storage by name */
|
||||
guint8 *validity_db_build_cmd_get_user_storage (const gchar *name,
|
||||
gsize *out_len);
|
||||
|
|
@ -171,20 +168,6 @@ guint8 *validity_db_build_cmd_get_user_storage (const gchar *name,
|
|||
guint8 *validity_db_build_cmd_get_user (guint16 dbid,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x4A: Lookup user by identity within a storage */
|
||||
guint8 *validity_db_build_cmd_lookup_user (guint16 storage_dbid,
|
||||
const guint8 *identity,
|
||||
gsize identity_len,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x49: Get record value */
|
||||
guint8 *validity_db_build_cmd_get_record_value (guint16 dbid,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x46: Get record children */
|
||||
guint8 *validity_db_build_cmd_get_record_children (guint16 dbid,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x47: New record */
|
||||
guint8 *validity_db_build_cmd_new_record (guint16 parent,
|
||||
guint16 type,
|
||||
|
|
@ -267,35 +250,15 @@ void validity_record_children_clear (ValidityRecordChildren *children);
|
|||
guint8 *validity_db_build_cmd_create_enrollment (gboolean start,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x68: Enrollment update start */
|
||||
guint8 *validity_db_build_cmd_enrollment_update_start (guint32 key,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x6B: Enrollment update (with template data) */
|
||||
guint8 *validity_db_build_cmd_enrollment_update (const guint8 *prev_data,
|
||||
gsize prev_len,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x51: Get program status */
|
||||
guint8 *validity_db_build_cmd_get_prg_status (gboolean extended,
|
||||
gsize *out_len);
|
||||
|
||||
/* cmd 0x04: Capture stop */
|
||||
guint8 *validity_db_build_cmd_capture_stop (gsize *out_len);
|
||||
|
||||
/* ================================================================
|
||||
* Match commands
|
||||
* Match commands (inlined at call sites in verify/enroll SSMs)
|
||||
* ================================================================ */
|
||||
|
||||
/* cmd 0x5E: Match finger */
|
||||
guint8 *validity_db_build_cmd_match_finger (gsize *out_len);
|
||||
|
||||
/* cmd 0x60: Get match result */
|
||||
guint8 *validity_db_build_cmd_get_match_result (gsize *out_len);
|
||||
|
||||
/* cmd 0x62: Match cleanup */
|
||||
guint8 *validity_db_build_cmd_match_cleanup (gsize *out_len);
|
||||
|
||||
/* ================================================================
|
||||
* db_write_enable blob access
|
||||
* ================================================================ */
|
||||
|
|
|
|||
|
|
@ -319,19 +319,6 @@ enroll_cleanup_stale (FpiSsm *ssm,
|
|||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_pre_get_storage (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Check for existing user records that would cause 0x0526 */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_get_user_storage (
|
||||
VALIDITY_STORAGE_NAME, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_pre_get_storage_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -395,33 +382,6 @@ enroll_pre_del_user_recv (FpiSsm *ssm,
|
|||
fpi_ssm_jump_to_state (ssm, ENROLL_PRE_DEL_USER);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_start (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x69 flag=1: create enrollment session */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (TRUE, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_start_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("create_enrollment failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_led_on_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -509,19 +469,6 @@ enroll_capture_stop_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_update_start (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x68: enrollment_update_start(key) */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_enrollment_update_start (
|
||||
self->enroll_key, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_update_start_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -559,40 +506,6 @@ enroll_wait_update_start_int (FpiSsm *ssm,
|
|||
update_interrupt_cb, ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: write_enable() before 1st enrollment_update */
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (1st) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_append_image (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x6B: enrollment_update with current template */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_enrollment_update (
|
||||
self->enroll_template, self->enroll_template_len, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_append_image_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -613,30 +526,6 @@ enroll_append_image_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_cleanups (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: call_cleanups() in finally block of enrollment_update (1st) */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_cleanups_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Status 0x0491 = nothing to commit, which is OK */
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("call_cleanups (1st) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_wait_update_int (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -654,41 +543,6 @@ enroll_wait_update_int (FpiSsm *ssm,
|
|||
update_interrupt_cb, ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable_read (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: write_enable() before 2nd enrollment_update */
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable_read_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (2nd) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_append_image_read (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Second cmd 0x6B: enrollment_update — reads the actual result
|
||||
* with template/header/tid data. Same payload as the first call. */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_enrollment_update (
|
||||
self->enroll_template, self->enroll_template_len, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_append_image_read_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -747,43 +601,6 @@ enroll_append_image_read_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_cleanups_read (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: call_cleanups() in finally block of enrollment_update (2nd) */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_cleanups_read_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("call_cleanups (2nd) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_update_end (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: enrollment_update_end() → pack('<BL', 0x69, 0)
|
||||
* Same as create_enrollment(FALSE) — signals end of this iteration's
|
||||
* update cycle. Called in PY's finally block for each iteration. */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (FALSE, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_loop_check (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -823,34 +640,6 @@ enroll_loop_check (FpiSsm *ssm,
|
|||
fpi_ssm_jump_to_state (ssm, ENROLL_LED_ON);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_update_end2 (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: second enrollment_update_end() after the loop.
|
||||
* Same command: pack('<BL', 0x69, 0) */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (FALSE, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_get_storage (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
|
||||
/* Discover the StgWindsor storage dbid — PY uses
|
||||
* db.get_user_storage(name='StgWindsor').dbid for all record ops. */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_get_user_storage (
|
||||
VALIDITY_STORAGE_NAME, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_get_storage_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -885,100 +674,6 @@ enroll_get_storage_recv (FpiSsm *ssm,
|
|||
fpi_ssm_jump_to_state (ssm, ENROLL_DB_WRITE_ENABLE2);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_init_storage_we (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: db.new_user_storate() → new_record(1, 4, 3, 'StgWindsor\0')
|
||||
* First: db_write_enable */
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_init_storage_we_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (init_storage) failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_init_storage_create (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: db.new_record(1, 4, 3, b'StgWindsor\0')
|
||||
* parent=1 (root), type=4 (storage), storage=3, data=name */
|
||||
const gchar *name = VALIDITY_STORAGE_NAME;
|
||||
gsize name_len = strlen (name) + 1; /* include NUL */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_new_record (
|
||||
1, 4, 3, (const guint8 *) name, name_len, &cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_init_storage_create_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("create storage failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
fp_info ("StgWindsor storage created successfully");
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_init_storage_clean (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable2 (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Enable DB writes for storing the finger record */
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable2_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("db_write_enable for finger creation failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Proceed to create a new user record with a UUID identity.
|
||||
* python-validity: usr = db.new_user(identity) */
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_create_user (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -1062,44 +757,6 @@ enroll_create_user_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_create_user_cleanups (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: new_record always calls call_cleanups in finally block */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable3 (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* PY: new_record calls db_write_enable before each cmd 0x47 */
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_db_write_enable3_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("db_write_enable3 failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_create_finger (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -1159,17 +816,6 @@ enroll_create_finger_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_final_cleanups (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_wait_finger_int (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -1186,46 +832,6 @@ enroll_wait_finger_int (FpiSsm *ssm,
|
|||
update_interrupt_cb, ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_led_on (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_start_cmd (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_get_prg_status (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x51: get_prg_status2 (after scan complete, before capture stop) */
|
||||
const guint8 cmd[] = { 0x51, 0x00, 0x20, 0x00, 0x00 };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_capture_stop (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x04: capture stop/cleanup */
|
||||
const guint8 cmd[] = { 0x04 };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_led_off (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_end_cmd (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
enroll_run_state (FpiSsm *ssm,
|
||||
FpDevice *dev)
|
||||
|
|
@ -1244,7 +850,13 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_PRE_GET_STORAGE:
|
||||
enroll_pre_get_storage (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_get_user_storage (
|
||||
VALIDITY_STORAGE_NAME, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_PRE_GET_STORAGE_RECV:
|
||||
|
|
@ -1260,15 +872,32 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_START:
|
||||
enroll_start (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (TRUE, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_START_RECV:
|
||||
enroll_start_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("create_enrollment failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_LED_ON:
|
||||
enroll_led_on (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_start_cmd (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_LED_ON_RECV:
|
||||
|
|
@ -1303,7 +932,10 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_GET_PRG_STATUS:
|
||||
enroll_get_prg_status (ssm, self);
|
||||
{
|
||||
const guint8 cmd[] = { 0x51, 0x00, 0x20, 0x00, 0x00 };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_GET_PRG_STATUS_RECV:
|
||||
|
|
@ -1312,7 +944,10 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_CAPTURE_STOP:
|
||||
enroll_capture_stop (ssm, self);
|
||||
{
|
||||
const guint8 cmd[] = { 0x04 };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_CAPTURE_STOP_RECV:
|
||||
|
|
@ -1320,7 +955,14 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_UPDATE_START:
|
||||
enroll_update_start (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_pack_new (&cmd_len, "bww",
|
||||
VCSFW_CMD_ENROLLMENT_UPDATE_START,
|
||||
self->enroll_key, (guint32) 0);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_UPDATE_START_RECV:
|
||||
|
|
@ -1332,15 +974,28 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE:
|
||||
enroll_db_write_enable (ssm, self);
|
||||
{
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE_RECV:
|
||||
enroll_db_write_enable_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (1st) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_APPEND_IMAGE:
|
||||
enroll_append_image (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_enrollment_update (
|
||||
self->enroll_template, self->enroll_template_len, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_APPEND_IMAGE_RECV:
|
||||
|
|
@ -1348,11 +1003,20 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_CLEANUPS:
|
||||
enroll_cleanups (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_CLEANUPS_RECV:
|
||||
enroll_cleanups_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("call_cleanups (1st) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_WAIT_UPDATE_INT:
|
||||
|
|
@ -1360,15 +1024,28 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE_READ:
|
||||
enroll_db_write_enable_read (ssm, self);
|
||||
{
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE_READ_RECV:
|
||||
enroll_db_write_enable_read_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (2nd) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_APPEND_IMAGE_READ:
|
||||
enroll_append_image_read (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_enrollment_update (
|
||||
self->enroll_template, self->enroll_template_len, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_APPEND_IMAGE_READ_RECV:
|
||||
|
|
@ -1376,15 +1053,29 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_CLEANUPS_READ:
|
||||
enroll_cleanups_read (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_CLEANUPS_READ_RECV:
|
||||
enroll_cleanups_read_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("call_cleanups (2nd) failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_UPDATE_END:
|
||||
enroll_update_end (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (FALSE, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_UPDATE_END_RECV:
|
||||
|
|
@ -1396,7 +1087,12 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_UPDATE_END2:
|
||||
enroll_update_end2 (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_create_enrollment (FALSE, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_UPDATE_END2_RECV:
|
||||
|
|
@ -1405,7 +1101,13 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_GET_STORAGE:
|
||||
enroll_get_storage (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_get_user_storage (
|
||||
VALIDITY_STORAGE_NAME, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_GET_STORAGE_RECV:
|
||||
|
|
@ -1413,23 +1115,52 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_WE:
|
||||
enroll_init_storage_we (ssm, self);
|
||||
{
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_WE_RECV:
|
||||
enroll_init_storage_we_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("db_write_enable (init_storage) failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_CREATE:
|
||||
enroll_init_storage_create (ssm, self);
|
||||
{
|
||||
const gchar *name = VALIDITY_STORAGE_NAME;
|
||||
gsize name_len = strlen (name) + 1;
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_new_record (
|
||||
1, 4, 3, (const guint8 *) name, name_len, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_CREATE_RECV:
|
||||
enroll_init_storage_create_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("create storage failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fp_info ("StgWindsor storage created successfully");
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_CLEAN:
|
||||
enroll_init_storage_clean (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_INIT_STORAGE_CLEAN_RECV:
|
||||
|
|
@ -1438,11 +1169,23 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE2:
|
||||
enroll_db_write_enable2 (ssm, self);
|
||||
{
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE2_RECV:
|
||||
enroll_db_write_enable2_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("db_write_enable for finger creation failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_CREATE_USER:
|
||||
|
|
@ -1454,7 +1197,12 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_CREATE_USER_CLEANUPS:
|
||||
enroll_create_user_cleanups (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_CREATE_USER_CLEANUPS_RECV:
|
||||
|
|
@ -1462,11 +1210,23 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE3:
|
||||
enroll_db_write_enable3 (ssm, self);
|
||||
{
|
||||
gsize blob_len;
|
||||
const guint8 *blob = validity_db_get_write_enable_blob (self, &blob_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, blob, blob_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_DB_WRITE_ENABLE3_RECV:
|
||||
enroll_db_write_enable3_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("db_write_enable3 failed: 0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case ENROLL_CREATE_FINGER:
|
||||
|
|
@ -1478,7 +1238,12 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_FINAL_CLEANUPS:
|
||||
enroll_final_cleanups (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_call_cleanups (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_FINAL_CLEANUPS_RECV:
|
||||
|
|
@ -1490,7 +1255,11 @@ enroll_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case ENROLL_LED_OFF:
|
||||
enroll_led_off (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_end_cmd (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ENROLL_LED_OFF_RECV:
|
||||
|
|
|
|||
|
|
@ -352,46 +352,6 @@ fwext_upload_data_free (gpointer data)
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
fwext_send_write_hw_reg (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[10];
|
||||
gsize cmd_len;
|
||||
|
||||
validity_fwext_build_write_hw_reg32 (FWEXT_HW_REG_WRITE_ADDR,
|
||||
FWEXT_HW_REG_WRITE_VALUE,
|
||||
cmd, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_write_hw_reg (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_HW_REG failed: status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_send_read_hw_reg (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[6];
|
||||
gsize cmd_len;
|
||||
|
||||
validity_fwext_build_read_hw_reg32 (FWEXT_HW_REG_READ_ADDR,
|
||||
cmd, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_read_hw_reg (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -484,22 +444,6 @@ fwext_send_db_write_enable (FpiSsm *ssm,
|
|||
vcsfw_tls_cmd_send (self, ssm, dbe, dbe_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_db_write_enable (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"db_write_enable failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_send_write_chunk (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -528,22 +472,6 @@ fwext_send_write_chunk (FpiSsm *ssm,
|
|||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_write_chunk (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_FLASH chunk failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_cleanup (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -590,22 +518,6 @@ fwext_send_write_signature (FpiSsm *ssm,
|
|||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_write_signature (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_FW_SIG failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_verify (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -629,49 +541,6 @@ fwext_recv_verify (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_send_reboot (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[3];
|
||||
gsize cmd_len;
|
||||
|
||||
validity_fwext_build_reboot (cmd, &cmd_len);
|
||||
|
||||
fp_info ("FWEXT: Rebooting sensor to activate new firmware");
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_recv_reboot (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Sensor will disconnect and re-enumerate on USB.
|
||||
* We mark SSM completed -- the caller (open sequence)
|
||||
* handles the post-reboot re-init. */
|
||||
fp_info ("FWEXT: Reboot sent. Device will re-enumerate.");
|
||||
fpi_ssm_mark_completed (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_send_cleanup (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUP };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
fwext_send_verify (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_FW_INFO, FWEXT_PARTITION };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
void
|
||||
validity_fwext_upload_run_state (FpiSsm *ssm,
|
||||
FpDevice *dev)
|
||||
|
|
@ -681,15 +550,36 @@ validity_fwext_upload_run_state (FpiSsm *ssm,
|
|||
switch (fpi_ssm_get_cur_state (ssm))
|
||||
{
|
||||
case FWEXT_SEND_WRITE_HW_REG:
|
||||
fwext_send_write_hw_reg (ssm, self);
|
||||
{
|
||||
guint8 cmd[10];
|
||||
gsize cmd_len;
|
||||
validity_fwext_build_write_hw_reg32 (FWEXT_HW_REG_WRITE_ADDR,
|
||||
FWEXT_HW_REG_WRITE_VALUE,
|
||||
cmd, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case FWEXT_RECV_WRITE_HW_REG:
|
||||
fwext_recv_write_hw_reg (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_HW_REG failed: status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case FWEXT_SEND_READ_HW_REG:
|
||||
fwext_send_read_hw_reg (ssm, self);
|
||||
{
|
||||
guint8 cmd[6];
|
||||
gsize cmd_len;
|
||||
validity_fwext_build_read_hw_reg32 (FWEXT_HW_REG_READ_ADDR,
|
||||
cmd, &cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case FWEXT_RECV_READ_HW_REG:
|
||||
|
|
@ -705,7 +595,16 @@ validity_fwext_upload_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case FWEXT_RECV_DB_WRITE_ENABLE:
|
||||
fwext_recv_db_write_enable (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"db_write_enable failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case FWEXT_SEND_WRITE_CHUNK:
|
||||
|
|
@ -713,11 +612,23 @@ validity_fwext_upload_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case FWEXT_RECV_WRITE_CHUNK:
|
||||
fwext_recv_write_chunk (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_FLASH chunk failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case FWEXT_SEND_CLEANUP:
|
||||
fwext_send_cleanup (ssm, self);
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUP };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case FWEXT_RECV_CLEANUP:
|
||||
|
|
@ -729,11 +640,23 @@ validity_fwext_upload_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case FWEXT_RECV_WRITE_SIGNATURE:
|
||||
fwext_recv_write_signature (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new_msg (FP_DEVICE_ERROR_PROTO,
|
||||
"WRITE_FW_SIG failed: "
|
||||
"status=0x%04x",
|
||||
self->cmd_response_status));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case FWEXT_SEND_VERIFY:
|
||||
fwext_send_verify (ssm, self);
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_FW_INFO, FWEXT_PARTITION };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case FWEXT_RECV_VERIFY:
|
||||
|
|
@ -741,11 +664,18 @@ validity_fwext_upload_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case FWEXT_SEND_REBOOT:
|
||||
fwext_send_reboot (ssm, self);
|
||||
{
|
||||
guint8 cmd[3];
|
||||
gsize cmd_len;
|
||||
validity_fwext_build_reboot (cmd, &cmd_len);
|
||||
fp_info ("FWEXT: Rebooting sensor to activate new firmware");
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case FWEXT_RECV_REBOOT:
|
||||
fwext_recv_reboot (ssm, self);
|
||||
fp_info ("FWEXT: Reboot sent. Device will re-enumerate.");
|
||||
fpi_ssm_mark_completed (ssm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ validity_unpack_one (FpiByteReader *r,
|
|||
|
||||
case 'd':
|
||||
{
|
||||
const guint8 **out = va_arg (*ap, const guint8 **);
|
||||
const guint8 **out = va_arg (*ap, const guint8 * *);
|
||||
gsize len = va_arg (*ap, gsize);
|
||||
return fpi_byte_reader_get_data (r, len, out);
|
||||
}
|
||||
|
|
@ -175,7 +175,8 @@ validity_pack_new (gsize *out_len,
|
|||
size += 1;
|
||||
break;
|
||||
|
||||
case 'h': case 'H':
|
||||
case 'h':
|
||||
case 'H':
|
||||
size += 2;
|
||||
(void) va_arg (ap, int);
|
||||
break;
|
||||
|
|
@ -185,7 +186,8 @@ validity_pack_new (gsize *out_len,
|
|||
(void) va_arg (ap, guint32);
|
||||
break;
|
||||
|
||||
case 'w': case 'W':
|
||||
case 'w':
|
||||
case 'W':
|
||||
size += 4;
|
||||
(void) va_arg (ap, guint32);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -655,23 +655,6 @@ pair_check_needed (FpiSsm *ssm,
|
|||
fpi_ssm_jump_to_state (ssm, PAIR_SEND_RESET_BLOB);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_verify_tls_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Read flash partition 1 (TLS cert store) to verify keys exist */
|
||||
guint8 cmd[13];
|
||||
|
||||
validity_pack (cmd, sizeof (cmd), "bbbhww",
|
||||
VCSFW_CMD_READ_FLASH,
|
||||
(guint8) 0x01, /* partition */
|
||||
(guint8) 0x01, /* access flag */
|
||||
(guint16) 0x0000,
|
||||
(guint32) 0x0000,
|
||||
(guint32) 0x1000);
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_verify_tls_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -770,21 +753,6 @@ pair_send_reset_blob (FpiSsm *ssm,
|
|||
vcsfw_cmd_send (self, ssm, reset_data, reset_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_send_reset_blob_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("reset_blob failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_generate_keys (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -937,62 +905,6 @@ pair_partition_flash_recv (FpiSsm *ssm,
|
|||
fpi_ssm_jump_to_state (ssm, PAIR_CMD50_SEND);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_factory_reset_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* CMD 0x10 + 0x61 zero bytes: wipes flash partition table.
|
||||
* python-validity: usb.cmd(b'\x10' + b'\0' * 0x61) */
|
||||
guint8 cmd[98];
|
||||
FpiByteWriter writer;
|
||||
|
||||
fpi_byte_writer_init_with_data (&writer, cmd, sizeof (cmd), FALSE);
|
||||
fpi_byte_writer_put_uint8 (&writer, 0x10);
|
||||
fpi_byte_writer_fill (&writer, 0, sizeof (cmd) - 1);
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_factory_reset_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("Factory reset cmd 0x10 status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
else
|
||||
fp_info ("Factory reset complete — rebooting sensor");
|
||||
|
||||
/* Reboot; next device open will pair from clean state */
|
||||
fpi_ssm_jump_to_state (ssm, PAIR_REBOOT_SEND);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_cmd50_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* CMD 0x50: get ECDH server parameters
|
||||
* python-validity: usb.cmd(unhex('50')) */
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_ECDH };
|
||||
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_cmd50_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("CMD 0x50 failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_cmd50_process (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -1137,31 +1049,6 @@ pair_cmd50_process (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_cleanups_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* CMD 0x1a: call_cleanups after CMD 0x50
|
||||
* python-validity: call_cleanups() in finally block */
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_cleanups_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* Ignore "nothing to commit" (0x0491) status */
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("cleanups failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ---- Phase 2: TLS handshake ---- */
|
||||
|
||||
static void
|
||||
|
|
@ -1211,47 +1098,6 @@ pair_erase_dbe_send (FpiSsm *ssm,
|
|||
vcsfw_tls_cmd_send (self, ssm, dbe_data, dbe_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_erase_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
ValidityPairState *ps = &self->pair_state;
|
||||
|
||||
/* CMD 0x3f: erase partition */
|
||||
guint8 cmd[2];
|
||||
|
||||
validity_pack (cmd, sizeof (cmd), "bb",
|
||||
VCSFW_CMD_ERASE_FLASH,
|
||||
pair_erase_partition_ids[ps->erase_step]);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_erase_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
ValidityPairState *ps = &self->pair_state;
|
||||
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("erase partition %u failed: status=0x%04x",
|
||||
pair_erase_partition_ids[ps->erase_step],
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_erase_clean_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
|
||||
/* Ignore "nothing to commit" */
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("post-erase cleanups status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_erase_loop (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -1326,34 +1172,6 @@ pair_write_flash_send (FpiSsm *ssm,
|
|||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_write_flash_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("write_flash failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
return;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_write_clean_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("post-write cleanups status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* ---- Phase 5: Reboot ---- */
|
||||
static void
|
||||
pair_reboot_send (FpiSsm *ssm,
|
||||
|
|
@ -1369,35 +1187,6 @@ pair_reboot_send (FpiSsm *ssm,
|
|||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_get_flash_info (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* CMD 0x3e: GET_FLASH_INFO — ask how many partitions exist */
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_FLASH_INFO };
|
||||
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_erase_clean_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* CMD 0x1a: call_cleanups after erase */
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pair_write_clean_send (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
void
|
||||
validity_pair_run_state (FpiSsm *ssm,
|
||||
FpDevice *dev)
|
||||
|
|
@ -1407,8 +1196,11 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
switch (fpi_ssm_get_cur_state (ssm))
|
||||
{
|
||||
case PAIR_GET_FLASH_INFO:
|
||||
pair_get_flash_info (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_FLASH_INFO };
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_GET_FLASH_INFO_RECV:
|
||||
/* Response already in self->cmd_response_* from vcsfw_cmd_send sub-SSM.
|
||||
|
|
@ -1421,8 +1213,18 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_VERIFY_TLS_SEND:
|
||||
pair_verify_tls_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[13];
|
||||
validity_pack (cmd, sizeof (cmd), "bbbhww",
|
||||
VCSFW_CMD_READ_FLASH,
|
||||
(guint8) 0x01,
|
||||
(guint8) 0x01,
|
||||
(guint16) 0x0000,
|
||||
(guint32) 0x0000,
|
||||
(guint32) 0x1000);
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_VERIFY_TLS_RECV:
|
||||
pair_verify_tls_recv (ssm, self);
|
||||
|
|
@ -1433,7 +1235,15 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_SEND_RESET_BLOB_RECV:
|
||||
pair_send_reset_blob_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("reset_blob failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_GENERATE_KEYS:
|
||||
|
|
@ -1449,19 +1259,42 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_FACTORY_RESET_SEND:
|
||||
pair_factory_reset_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[98];
|
||||
FpiByteWriter writer;
|
||||
fpi_byte_writer_init_with_data (&writer, cmd, sizeof (cmd), FALSE);
|
||||
fpi_byte_writer_put_uint8 (&writer, 0x10);
|
||||
fpi_byte_writer_fill (&writer, 0, sizeof (cmd) - 1);
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_FACTORY_RESET_RECV:
|
||||
pair_factory_reset_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("Factory reset cmd 0x10 status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
else
|
||||
fp_info ("Factory reset complete — rebooting sensor");
|
||||
fpi_ssm_jump_to_state (ssm, PAIR_REBOOT_SEND);
|
||||
break;
|
||||
|
||||
case PAIR_CMD50_SEND:
|
||||
pair_cmd50_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_GET_ECDH };
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_CMD50_RECV:
|
||||
pair_cmd50_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("CMD 0x50 failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_CMD50_PROCESS:
|
||||
|
|
@ -1469,11 +1302,19 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_CLEANUPS_SEND:
|
||||
pair_cleanups_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
vcsfw_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_CLEANUPS_RECV:
|
||||
pair_cleanups_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("cleanups failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_TLS_HANDSHAKE:
|
||||
pair_tls_handshake (ssm, self);
|
||||
|
|
@ -1488,19 +1329,40 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_ERASE_SEND:
|
||||
pair_erase_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
ValidityPairState *ps = &self->pair_state;
|
||||
guint8 cmd[2];
|
||||
validity_pack (cmd, sizeof (cmd), "bb",
|
||||
VCSFW_CMD_ERASE_FLASH,
|
||||
pair_erase_partition_ids[ps->erase_step]);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_ERASE_RECV:
|
||||
pair_erase_recv (ssm, self);
|
||||
break;
|
||||
{
|
||||
ValidityPairState *ps = &self->pair_state;
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
fp_warn ("erase partition %u failed: status=0x%04x",
|
||||
pair_erase_partition_ids[ps->erase_step],
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_ERASE_CLEAN_SEND:
|
||||
pair_erase_clean_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_ERASE_CLEAN_RECV:
|
||||
pair_erase_clean_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("post-erase cleanups status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_ERASE_LOOP:
|
||||
|
|
@ -1519,15 +1381,31 @@ validity_pair_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case PAIR_WRITE_FLASH_RECV:
|
||||
pair_write_flash_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK)
|
||||
{
|
||||
fp_warn ("write_flash failed: status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_mark_failed (ssm,
|
||||
fpi_device_error_new (FP_DEVICE_ERROR_PROTO));
|
||||
break;
|
||||
}
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_WRITE_CLEAN_SEND:
|
||||
pair_write_clean_send (ssm, self);
|
||||
break;
|
||||
{
|
||||
guint8 cmd[] = { VCSFW_CMD_CLEANUPS };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
case PAIR_WRITE_CLEAN_RECV:
|
||||
pair_write_clean_recv (ssm, self);
|
||||
if (self->cmd_response_status != VCSFW_STATUS_OK &&
|
||||
self->cmd_response_status != 0x0491)
|
||||
fp_warn ("post-write cleanups status=0x%04x",
|
||||
self->cmd_response_status);
|
||||
fpi_ssm_next_state (ssm);
|
||||
break;
|
||||
|
||||
case PAIR_REBOOT_SEND:
|
||||
pair_reboot_send (ssm, self);
|
||||
|
|
|
|||
|
|
@ -364,18 +364,6 @@ verify_capture_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_match_start (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x5E: match_finger */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_match_finger (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_match_start_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -391,18 +379,6 @@ verify_match_start_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_get_result (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x60: get_match_result */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_get_match_result (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_get_result_recv (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
|
|
@ -427,58 +403,6 @@ verify_get_result_recv (FpiSsm *ssm,
|
|||
fpi_ssm_next_state (ssm);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_cleanup (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x62: match_cleanup */
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_db_build_cmd_match_cleanup (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_led_on (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_start_cmd (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_get_prg_status (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x51: get_prg_status2 (after scan complete, before capture stop) */
|
||||
const guint8 cmd[] = { 0x51, 0x00, 0x20, 0x00, 0x00 };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_capture_stop (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
/* cmd 0x04: capture stop/cleanup */
|
||||
const guint8 cmd[] = { 0x04 };
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_led_off (FpiSsm *ssm,
|
||||
FpiDeviceValidity *self)
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_end_cmd (&cmd_len);
|
||||
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
verify_run_state (FpiSsm *ssm,
|
||||
FpDevice *dev)
|
||||
|
|
@ -488,7 +412,11 @@ verify_run_state (FpiSsm *ssm,
|
|||
switch (fpi_ssm_get_cur_state (ssm))
|
||||
{
|
||||
case VERIFY_LED_ON:
|
||||
verify_led_on (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_start_cmd (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_LED_ON_RECV:
|
||||
|
|
@ -516,7 +444,10 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_GET_PRG_STATUS:
|
||||
verify_get_prg_status (ssm, self);
|
||||
{
|
||||
const guint8 cmd[] = { 0x51, 0x00, 0x20, 0x00, 0x00 };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_GET_PRG_STATUS_RECV:
|
||||
|
|
@ -525,7 +456,10 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_CAPTURE_STOP:
|
||||
verify_capture_stop (ssm, self);
|
||||
{
|
||||
const guint8 cmd[] = { 0x04 };
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, sizeof (cmd), NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_CAPTURE_STOP_RECV:
|
||||
|
|
@ -534,7 +468,14 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_MATCH_START:
|
||||
verify_match_start (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_pack_new (&cmd_len, "bbbhhhhh",
|
||||
VCSFW_CMD_MATCH_FINGER,
|
||||
0x02, 0xFF, 0, 0, 1, 0, 0);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_MATCH_START_RECV:
|
||||
|
|
@ -547,7 +488,14 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_GET_RESULT:
|
||||
verify_get_result (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_pack_new (&cmd_len, "bw",
|
||||
VCSFW_CMD_GET_MATCH_RESULT,
|
||||
(guint32) 0);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_GET_RESULT_RECV:
|
||||
|
|
@ -555,7 +503,14 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_CLEANUP:
|
||||
verify_cleanup (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
guint8 *cmd = validity_pack_new (&cmd_len, "bw",
|
||||
VCSFW_CMD_MATCH_CLEANUP,
|
||||
(guint32) 0);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
g_free (cmd);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_CLEANUP_RECV:
|
||||
|
|
@ -564,7 +519,11 @@ verify_run_state (FpiSsm *ssm,
|
|||
break;
|
||||
|
||||
case VERIFY_LED_OFF:
|
||||
verify_led_off (ssm, self);
|
||||
{
|
||||
gsize cmd_len;
|
||||
const guint8 *cmd = validity_capture_glow_end_cmd (&cmd_len);
|
||||
vcsfw_tls_cmd_send (self, ssm, cmd, cmd_len, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case VERIFY_LED_OFF_RECV:
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "drivers/validity/validity_sensor.h"
|
||||
#include "drivers/validity/validity_fwext.h"
|
||||
#include "drivers/validity/vcsfw_protocol.h"
|
||||
#include "drivers/validity/validity_pack.h"
|
||||
#include "drivers/validity/validity_db.h"
|
||||
#include "drivers/validity/validity_capture.h"
|
||||
#include "drivers/validity/validity_tls.h"
|
||||
|
|
@ -1408,7 +1409,7 @@ static void
|
|||
test_cmd_db_info (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_info (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "b", VCSFW_CMD_DB_INFO);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 1);
|
||||
|
|
@ -1482,8 +1483,13 @@ test_cmd_lookup_user (void)
|
|||
{
|
||||
gsize len;
|
||||
guint8 identity[] = { 0x01, 0x02, 0x03, 0x04 };
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_lookup_user (
|
||||
0x0003, identity, sizeof (identity), &len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (
|
||||
&len, "bhhhd",
|
||||
VCSFW_CMD_GET_USER,
|
||||
(guint16) 0, /* dbid = 0 → lookup by name */
|
||||
(guint16) 0x0003, /* storage */
|
||||
(guint16) sizeof (identity), /* identity_len */
|
||||
identity, (gsize) sizeof (identity));
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 7 + sizeof (identity));
|
||||
|
|
@ -1569,7 +1575,10 @@ static void
|
|||
test_cmd_enrollment_update_start (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_enrollment_update_start (0x12345678, &len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bww",
|
||||
VCSFW_CMD_ENROLLMENT_UPDATE_START,
|
||||
(guint32) 0x12345678,
|
||||
(guint32) 0);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 9);
|
||||
|
|
@ -1587,7 +1596,9 @@ static void
|
|||
test_cmd_match_finger (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_match_finger (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bbbhhhhh",
|
||||
VCSFW_CMD_MATCH_FINGER,
|
||||
0x02, 0xFF, 0, 0, 1, 0, 0);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 13);
|
||||
|
|
@ -1610,7 +1621,9 @@ static void
|
|||
test_cmd_get_match_result (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_get_match_result (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bw",
|
||||
VCSFW_CMD_GET_MATCH_RESULT,
|
||||
(guint32) 0);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 5);
|
||||
|
|
@ -1631,7 +1644,9 @@ static void
|
|||
test_cmd_match_cleanup (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_match_cleanup (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bw",
|
||||
VCSFW_CMD_MATCH_CLEANUP,
|
||||
(guint32) 0);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 5);
|
||||
|
|
@ -1648,7 +1663,9 @@ test_cmd_get_prg_status (void)
|
|||
{
|
||||
gsize len;
|
||||
|
||||
g_autofree guint8 *normal = validity_db_build_cmd_get_prg_status (FALSE, &len);
|
||||
g_autofree guint8 *normal = validity_pack_new (&len, "bw",
|
||||
VCSFW_CMD_GET_PRG_STATUS,
|
||||
(guint32) 0);
|
||||
|
||||
g_assert_cmpuint (len, ==, 5);
|
||||
g_assert_cmpuint (normal[0], ==, VCSFW_CMD_GET_PRG_STATUS);
|
||||
|
|
@ -1658,7 +1675,9 @@ test_cmd_get_prg_status (void)
|
|||
g_assert_cmpuint (normal[3], ==, 0);
|
||||
g_assert_cmpuint (normal[4], ==, 0);
|
||||
|
||||
g_autofree guint8 *ext = validity_db_build_cmd_get_prg_status (TRUE, &len);
|
||||
g_autofree guint8 *ext = validity_pack_new (&len, "bw",
|
||||
VCSFW_CMD_GET_PRG_STATUS,
|
||||
(guint32) 0x00002000);
|
||||
g_assert_cmpuint (len, ==, 5);
|
||||
g_assert_cmpuint (ext[0], ==, VCSFW_CMD_GET_PRG_STATUS);
|
||||
/* Extended: 00200000 LE */
|
||||
|
|
@ -1677,7 +1696,8 @@ static void
|
|||
test_cmd_capture_stop (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_capture_stop (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "b",
|
||||
VCSFW_CMD_CAPTURE_STOP);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 1);
|
||||
|
|
@ -2065,7 +2085,9 @@ static void
|
|||
test_cmd_get_record_value (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_get_record_value (0x5678, &len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bh",
|
||||
VCSFW_CMD_GET_RECORD_VALUE,
|
||||
(guint16) 0x5678);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 3);
|
||||
|
|
@ -2082,7 +2104,9 @@ static void
|
|||
test_cmd_get_record_children (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_get_record_children (0x1234, &len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bh",
|
||||
VCSFW_CMD_GET_RECORD_CHILDREN,
|
||||
(guint16) 0x1234);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 3);
|
||||
|
|
@ -2477,7 +2501,9 @@ static void
|
|||
test_match_finger_size (void)
|
||||
{
|
||||
gsize len;
|
||||
g_autofree guint8 *cmd = validity_db_build_cmd_match_finger (&len);
|
||||
g_autofree guint8 *cmd = validity_pack_new (&len, "bbbhhhhh",
|
||||
VCSFW_CMD_MATCH_FINGER,
|
||||
0x02, 0xFF, 0, 0, 1, 0, 0);
|
||||
|
||||
g_assert_nonnull (cmd);
|
||||
g_assert_cmpuint (len, ==, 13);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue