Coverage Report

Created: 2026-08-15 06:58

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
25.2k
G_DEFINE_TYPE(FuGenesysUsbhubCodesignFirmware,
19
25.2k
        fu_genesys_usbhub_codesign_firmware,
20
25.2k
        FU_TYPE_FIRMWARE)
21
25.2k
22
25.2k
gint
23
25.2k
fu_genesys_usbhub_codesign_firmware_get_codesign(FuGenesysUsbhubCodesignFirmware *self)
24
25.2k
{
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
587
{
35
587
  gsize streamsz = 0;
36
587
  if (!fu_input_stream_size(stream, &streamsz, error))
37
0
    return FALSE;
38
587
  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
587
  if (streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE &&
46
419
      streamsz - offset != FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) {
47
373
    g_set_error_literal(error,
48
373
            FWUPD_ERROR,
49
373
            FWUPD_ERROR_INVALID_FILE,
50
373
            "unknown codesign format");
51
373
    return FALSE;
52
373
  }
53
  /* success */
54
214
  return TRUE;
55
587
}
56
57
static gboolean
58
fu_genesys_usbhub_codesign_firmware_parse(FuFirmware *firmware,
59
            FuInputStream *stream,
60
            FuFirmwareParseFlags flags,
61
            GError **error)
62
214
{
63
214
  FuGenesysUsbhubCodesignFirmware *self = FU_GENESYS_USBHUB_CODESIGN_FIRMWARE(firmware);
64
214
  gsize streamsz = 0;
65
214
  gsize code_size;
66
67
214
  if (!fu_input_stream_size(stream, &streamsz, error))
68
0
    return FALSE;
69
214
  code_size = streamsz;
70
214
  if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_RSA_SIZE) {
71
168
    if (!fu_struct_genesys_fw_codesign_info_rsa_validate_stream(stream, 0x0, error)) {
72
167
      g_prefix_error_literal(error, "not valid for codesign: ");
73
167
      return FALSE;
74
167
    }
75
1
    self->codesign = FU_GENESYS_FW_CODESIGN_RSA;
76
46
  } else if (code_size == FU_STRUCT_GENESYS_FW_CODESIGN_INFO_ECDSA_SIZE) {
77
46
    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
46
    self->codesign = FU_GENESYS_FW_CODESIGN_ECDSA;
82
46
  } 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
47
  fu_firmware_set_id(firmware, fu_genesys_fw_type_to_string(FU_GENESYS_FW_TYPE_CODESIGN));
92
47
  fu_firmware_set_idx(firmware, FU_GENESYS_FW_TYPE_CODESIGN);
93
47
  fu_firmware_set_size(firmware, code_size);
94
95
47
  return TRUE;
96
214
}
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
587
{
110
587
}
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
}