/src/fwupd/plugins/genesys/fu-genesys-usbhub-codesign-firmware.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2023 Adam.Chen <Adam.Chen@genesyslogic.com.tw> |
3 | | * |
4 | | * SPDX-License-Identifier: LGPL-2.1-or-later |
5 | | */ |
6 | | |
7 | | #include "config.h" |
8 | | |
9 | | #include "fu-genesys-common.h" |
10 | | #include "fu-genesys-usbhub-codesign-firmware.h" |
11 | | #include "fu-genesys-usbhub-struct.h" |
12 | | |
13 | | struct _FuGenesysUsbhubCodesignFirmware { |
14 | | FuFirmware parent_instance; |
15 | | FuGenesysFwCodesign codesign; |
16 | | }; |
17 | | |
18 | 28.3k | G_DEFINE_TYPE(FuGenesysUsbhubCodesignFirmware, |
19 | 28.3k | fu_genesys_usbhub_codesign_firmware, |
20 | 28.3k | FU_TYPE_FIRMWARE) |
21 | 28.3k | |
22 | 28.3k | gint |
23 | 28.3k | fu_genesys_usbhub_codesign_firmware_get_codesign(FuGenesysUsbhubCodesignFirmware *self) |
24 | 28.3k | { |
25 | 0 | g_return_val_if_fail(FU_IS_GENESYS_USBHUB_CODESIGN_FIRMWARE(self), 0); |
26 | 0 | return self->codesign; |
27 | 0 | } |
28 | | |
29 | | static gboolean |
30 | | fu_genesys_usbhub_codesign_firmware_validate(FuFirmware *firmware, |
31 | | GInputStream *stream, |
32 | | gsize offset, |
33 | | GError **error) |
34 | 919 | { |
35 | 919 | gsize streamsz = 0; |
36 | 919 | if (!fu_input_stream_size(stream, &streamsz, error)) |
37 | 0 | return FALSE; |
38 | 919 | if (streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE && |
39 | 695 | streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) { |
40 | 654 | g_set_error_literal(error, |
41 | 654 | FWUPD_ERROR, |
42 | 654 | FWUPD_ERROR_INVALID_FILE, |
43 | 654 | "unknown codesign format"); |
44 | 654 | return FALSE; |
45 | 654 | } |
46 | | /* success */ |
47 | 265 | return TRUE; |
48 | 919 | } |
49 | | |
50 | | static gboolean |
51 | | fu_genesys_usbhub_codesign_firmware_parse(FuFirmware *firmware, |
52 | | GInputStream *stream, |
53 | | FuFirmwareParseFlags flags, |
54 | | GError **error) |
55 | 265 | { |
56 | 265 | FuGenesysUsbhubCodesignFirmware *self = FU_GENESYS_USBHUB_CODESIGN_FIRMWARE(firmware); |
57 | 265 | gsize streamsz = 0; |
58 | 265 | gsize code_size; |
59 | | |
60 | 265 | if (!fu_input_stream_size(stream, &streamsz, error)) |
61 | 0 | return FALSE; |
62 | 265 | code_size = streamsz; |
63 | 265 | if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE) { |
64 | 224 | if (!fu_struct_genesys_fw_codesign_info_rsa_validate_stream(stream, 0x0, error)) { |
65 | 221 | g_prefix_error_literal(error, "not valid for codesign: "); |
66 | 221 | return FALSE; |
67 | 221 | } |
68 | 3 | self->codesign = FU_GENESYS_FW_CODESIGN_RSA; |
69 | 41 | } else if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) { |
70 | 41 | if (!fu_struct_genesys_fw_codesign_info_ecdsa_validate_stream(stream, 0x0, error)) { |
71 | 0 | g_prefix_error_literal(error, "not valid for codesign: "); |
72 | 0 | return FALSE; |
73 | 0 | } |
74 | 41 | self->codesign = FU_GENESYS_FW_CODESIGN_ECDSA; |
75 | 41 | } else { |
76 | 0 | g_set_error(error, |
77 | 0 | FWUPD_ERROR, |
78 | 0 | FWUPD_ERROR_INVALID_FILE, |
79 | 0 | "unknown file format of size 0x%x", |
80 | 0 | (guint)streamsz); |
81 | 0 | return FALSE; |
82 | 0 | } |
83 | | |
84 | 44 | fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_CODESIGN)); |
85 | 44 | fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_CODESIGN); |
86 | 44 | fu_firmware_set_size(firmware, code_size); |
87 | | |
88 | 44 | return TRUE; |
89 | 265 | } |
90 | | |
91 | | static void |
92 | | fu_genesys_usbhub_codesign_firmware_export(FuFirmware *firmware, |
93 | | FuFirmwareExportFlags flags, |
94 | | XbBuilderNode *bn) |
95 | 0 | { |
96 | 0 | FuGenesysUsbhubCodesignFirmware *self = FU_GENESYS_USBHUB_CODESIGN_FIRMWARE(firmware); |
97 | 0 | fu_xmlb_builder_insert_kv(bn, "codesign", fu_genesys_fw_codesign_to_string(self->codesign)); |
98 | 0 | } |
99 | | |
100 | | static void |
101 | | fu_genesys_usbhub_codesign_firmware_init(FuGenesysUsbhubCodesignFirmware *self) |
102 | 919 | { |
103 | 919 | } |
104 | | |
105 | | static void |
106 | | fu_genesys_usbhub_codesign_firmware_class_init(FuGenesysUsbhubCodesignFirmwareClass *klass) |
107 | 1 | { |
108 | 1 | FuFirmwareClass *firmware_class = FU_FIRMWARE_CLASS(klass); |
109 | 1 | firmware_class->validate = fu_genesys_usbhub_codesign_firmware_validate; |
110 | 1 | firmware_class->parse = fu_genesys_usbhub_codesign_firmware_parse; |
111 | 1 | firmware_class->export = fu_genesys_usbhub_codesign_firmware_export; |
112 | 1 | } |