/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 | 24.1k | G_DEFINE_TYPE(FuGenesysUsbhubCodesignFirmware, |
19 | 24.1k | fu_genesys_usbhub_codesign_firmware, |
20 | 24.1k | FU_TYPE_FIRMWARE) |
21 | 24.1k | |
22 | 24.1k | gint |
23 | 24.1k | fu_genesys_usbhub_codesign_firmware_get_codesign(FuGenesysUsbhubCodesignFirmware *self) |
24 | 24.1k | { |
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 | | FuInputStream *stream, |
32 | | gsize offset, |
33 | | GError **error) |
34 | 598 | { |
35 | 598 | gsize streamsz = 0; |
36 | 598 | if (!fu_input_stream_size(stream, &streamsz, error)) |
37 | 0 | return FALSE; |
38 | 598 | if (offset > streamsz) { |
39 | 0 | g_set_error_literal(error, |
40 | 0 | FWUPD_ERROR, |
41 | 0 | FWUPD_ERROR_INVALID_FILE, |
42 | 0 | "offset is larger than stream"); |
43 | 0 | return FALSE; |
44 | 0 | } |
45 | 598 | if (streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE && |
46 | 418 | streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) { |
47 | 375 | g_set_error_literal(error, |
48 | 375 | FWUPD_ERROR, |
49 | 375 | FWUPD_ERROR_INVALID_FILE, |
50 | 375 | "unknown codesign format"); |
51 | 375 | return FALSE; |
52 | 375 | } |
53 | | /* success */ |
54 | 223 | return TRUE; |
55 | 598 | } |
56 | | |
57 | | static gboolean |
58 | | fu_genesys_usbhub_codesign_firmware_parse(FuFirmware *firmware, |
59 | | FuInputStream *stream, |
60 | | FuFirmwareParseFlags flags, |
61 | | GError **error) |
62 | 223 | { |
63 | 223 | FuGenesysUsbhubCodesignFirmware *self = FU_GENESYS_USBHUB_CODESIGN_FIRMWARE(firmware); |
64 | 223 | gsize streamsz = 0; |
65 | 223 | gsize code_size; |
66 | | |
67 | 223 | if (!fu_input_stream_size(stream, &streamsz, error)) |
68 | 0 | return FALSE; |
69 | 223 | code_size = streamsz; |
70 | 223 | if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE) { |
71 | 180 | if (!fu_struct_genesys_fw_codesign_info_rsa_validate_stream(stream, 0x0, error)) { |
72 | 178 | g_prefix_error_literal(error, "not valid for codesign: "); |
73 | 178 | return FALSE; |
74 | 178 | } |
75 | 2 | self->codesign = FU_GENESYS_FW_CODESIGN_RSA; |
76 | 43 | } else if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) { |
77 | 43 | if (!fu_struct_genesys_fw_codesign_info_ecdsa_validate_stream(stream, 0x0, error)) { |
78 | 0 | g_prefix_error_literal(error, "not valid for codesign: "); |
79 | 0 | return FALSE; |
80 | 0 | } |
81 | 43 | self->codesign = FU_GENESYS_FW_CODESIGN_ECDSA; |
82 | 43 | } else { |
83 | 0 | g_set_error(error, |
84 | 0 | FWUPD_ERROR, |
85 | 0 | FWUPD_ERROR_INVALID_FILE, |
86 | 0 | "unknown file format of size 0x%x", |
87 | 0 | (guint)streamsz); |
88 | 0 | return FALSE; |
89 | 0 | } |
90 | | |
91 | 45 | fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_CODESIGN)); |
92 | 45 | fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_CODESIGN); |
93 | 45 | fu_firmware_set_size(firmware, code_size); |
94 | | |
95 | 45 | return TRUE; |
96 | 223 | } |
97 | | |
98 | | static void |
99 | | fu_genesys_usbhub_codesign_firmware_export(FuFirmware *firmware, |
100 | | FuFirmwareExportFlags flags, |
101 | | XbBuilderNode *bn) |
102 | 0 | { |
103 | 0 | FuGenesysUsbhubCodesignFirmware *self = FU_GENESYS_USBHUB_CODESIGN_FIRMWARE(firmware); |
104 | 0 | fu_xmlb_builder_insert_kv(bn, "codesign", fu_genesys_fw_codesign_to_string(self->codesign)); |
105 | 0 | } |
106 | | |
107 | | static void |
108 | | fu_genesys_usbhub_codesign_firmware_init(FuGenesysUsbhubCodesignFirmware *self) |
109 | 598 | { |
110 | 598 | } |
111 | | |
112 | | static void |
113 | | fu_genesys_usbhub_codesign_firmware_class_init(FuGenesysUsbhubCodesignFirmwareClass *klass) |
114 | 1 | { |
115 | 1 | FuFirmwareClass *firmware_class = FU_FIRMWARE_CLASS(klass); |
116 | 1 | firmware_class->validate = fu_genesys_usbhub_codesign_firmware_validate; |
117 | 1 | firmware_class->parse = fu_genesys_usbhub_codesign_firmware_parse; |
118 | 1 | firmware_class->export = fu_genesys_usbhub_codesign_firmware_export; |
119 | 1 | fu_firmware_set_size_max(firmware_class, 16 * FU_MB); |
120 | 1 | } |