Coverage Report

Created: 2026-07-16 07:10

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
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
}