diff --git a/libfprint/drivers/validity/validity_db.c b/libfprint/drivers/validity/validity_db.c index 7da97f4a..0a4b91c3 100644 --- a/libfprint/drivers/validity/validity_db.c +++ b/libfprint/drivers/validity/validity_db.c @@ -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('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('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: diff --git a/libfprint/drivers/validity/validity_fwext.c b/libfprint/drivers/validity/validity_fwext.c index 2c290e75..ed686239 100644 --- a/libfprint/drivers/validity/validity_fwext.c +++ b/libfprint/drivers/validity/validity_fwext.c @@ -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; } } diff --git a/libfprint/drivers/validity/validity_pack.h b/libfprint/drivers/validity/validity_pack.h index e8fabf33..a4856b84 100644 --- a/libfprint/drivers/validity/validity_pack.h +++ b/libfprint/drivers/validity/validity_pack.h @@ -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; diff --git a/libfprint/drivers/validity/validity_pair.c b/libfprint/drivers/validity/validity_pair.c index 0efb1b25..e616af68 100644 --- a/libfprint/drivers/validity/validity_pair.c +++ b/libfprint/drivers/validity/validity_pair.c @@ -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); diff --git a/libfprint/drivers/validity/validity_verify.c b/libfprint/drivers/validity/validity_verify.c index 59bc1990..c556121a 100644 --- a/libfprint/drivers/validity/validity_verify.c +++ b/libfprint/drivers/validity/validity_verify.c @@ -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: diff --git a/tests/test-validity.c b/tests/test-validity.c index a8026edd..058cfc53 100644 --- a/tests/test-validity.c +++ b/tests/test-validity.c @@ -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);