Coverage Report

Created: 2026-01-17 07:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}