goodixmoc/proto: Use a byte-reader to parse the finger ID

This commit is contained in:
Marco Trevisan (Treviño)
2025-02-13 20:54:55 +01:00
committed by Marco Trevisan
parent 63b5908f38
commit fc3effd73b

View File

@@ -259,39 +259,44 @@ gx_proto_parse_header (FpiByteReader *reader,
} }
static int static int
gx_proto_parse_fingerid (const uint8_t * fid_buffer, gx_proto_parse_fingerid (FpiByteReader *reader,
uint16_t fid_buffer_size,
ptemplate_format_t template) ptemplate_format_t template)
{ {
const uint8_t * buffer = NULL; uint8_t byte;
uint16_t Offset = 0; const uint8_t *buffer;
if (!template || !fid_buffer) if (!template)
return -1; return -1;
if (fid_buffer_size < G_STRUCT_OFFSET (template_format_t, payload) + sizeof (uint32_t)) if (!fpi_byte_reader_get_uint8 (reader, &byte) || byte != 67)
return -1; g_return_val_if_reached (-1);
buffer = fid_buffer; if (!fpi_byte_reader_get_uint8 (reader, &template->type))
Offset = 0; g_return_val_if_reached (-1);
if (buffer[Offset++] != 67) if (!fpi_byte_reader_get_uint8 (reader, &template->finger_index))
return -1; g_return_val_if_reached (-1);
template->type = buffer[Offset++]; if (!fpi_byte_reader_skip (reader, 1))
template->finger_index = buffer[Offset++]; g_return_val_if_reached (-1);
Offset++;
memcpy (template->accountid, &buffer[Offset], sizeof (template->accountid)); if (!fpi_byte_reader_get_data (reader, sizeof (template->accountid), &buffer))
Offset += sizeof (template->accountid); g_return_val_if_reached (-1);
memcpy (template->tid, &buffer[Offset], sizeof (template->tid));
Offset += sizeof (template->tid); // Offset == 68 memcpy (template->accountid, buffer, sizeof (template->accountid));
template->payload.size = buffer[Offset++];
if (template->payload.size > sizeof (template->payload.data)) if (!fpi_byte_reader_get_data (reader, sizeof (template->tid), &buffer))
return -1; g_return_val_if_reached (-1);
if (template->payload.size + Offset > fid_buffer_size)
return -1; memcpy (template->tid, buffer, sizeof (template->tid));
memset (template->payload.data, 0, template->payload.size);
memcpy (template->payload.data, &buffer[Offset], template->payload.size); if (!fpi_byte_reader_get_uint8 (reader, &template->payload.size))
g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_data (reader, template->payload.size, &buffer))
g_return_val_if_reached (-1);
memcpy (template->payload.data, buffer, template->payload.size);
return 0; return 0;
} }
@@ -387,16 +392,15 @@ gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_respons
if (presp->check_duplicate_resp.duplicate) if (presp->check_duplicate_resp.duplicate)
{ {
uint16_t tid_size; uint16_t tid_size;
const uint8_t *tid_data; FpiByteReader tid_reader;
if (!fpi_byte_reader_get_uint16_le (byte_reader, &tid_size)) if (!fpi_byte_reader_get_uint16_le (byte_reader, &tid_size))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_data (byte_reader, tid_size, &tid_data)) if (!fpi_byte_reader_get_sub_reader (byte_reader, &tid_reader, tid_size))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (tid_data, tid_size, if (gx_proto_parse_fingerid (&tid_reader, &presp->check_duplicate_resp.template) != 0)
&presp->check_duplicate_resp.template) != 0)
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
} }
break; break;
@@ -412,16 +416,16 @@ gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_respons
for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++) for(uint8_t num = 0; num < presp->finger_list_resp.finger_num; num++)
{ {
uint16_t fingerid_length; uint16_t fingerid_length;
const uint8_t *fingerid_data; FpiByteReader fingerid_reader;
if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_length)) if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_length))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_data (byte_reader, fingerid_length, &fingerid_data)) if (!fpi_byte_reader_get_sub_reader (byte_reader, &fingerid_reader,
fingerid_length))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (fingerid_data, if (gx_proto_parse_fingerid (&fingerid_reader,
fingerid_length,
&presp->finger_list_resp.finger_list[num]) != 0) &presp->finger_list_resp.finger_list[num]) != 0)
{ {
g_warning ("Failed to parse finger list"); g_warning ("Failed to parse finger list");
@@ -440,7 +444,7 @@ gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_respons
if (presp->verify.match) if (presp->verify.match)
{ {
const uint8_t *finger_data; FpiByteReader finger_reader;
if (!fpi_byte_reader_get_uint16_le (byte_reader, if (!fpi_byte_reader_get_uint16_le (byte_reader,
&presp->verify.rejectdetail)) &presp->verify.rejectdetail))
@@ -455,11 +459,11 @@ gx_proto_parse_body (uint16_t cmd, FpiByteReader *byte_reader, pgxfp_cmd_respons
if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_size)) if (!fpi_byte_reader_get_uint16_le (byte_reader, &fingerid_size))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (!fpi_byte_reader_get_data (byte_reader, fingerid_size, if (!fpi_byte_reader_get_sub_reader (byte_reader, &finger_reader,
&finger_data)) fingerid_size))
g_return_val_if_reached (-1); g_return_val_if_reached (-1);
if (gx_proto_parse_fingerid (finger_data, fingerid_size, if (gx_proto_parse_fingerid (&finger_reader,
&presp->verify.template) != 0) &presp->verify.template) != 0)
{ {
presp->result = GX_FAILED; presp->result = GX_FAILED;