Coverage Report

Created: 2025-10-10 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-efi-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-efi-struct.h"
5
#include "fu-byte-array.h"
6
#include "fu-mem-private.h"
7
#include "fu-string.h"
8
9
#ifdef G_LOG_DOMAIN
10
  #undef G_LOG_DOMAIN
11
#endif
12
0
#define G_LOG_DOMAIN "FuStruct"
13
14
const gchar *
15
fu_efi_signature_kind_to_string(FuEfiSignatureKind val)
16
0
{
17
0
    if (val == FU_EFI_SIGNATURE_KIND_UNKNOWN)
18
0
        return "unknown";
19
0
    if (val == FU_EFI_SIGNATURE_KIND_SHA256)
20
0
        return "sha256";
21
0
    if (val == FU_EFI_SIGNATURE_KIND_X509)
22
0
        return "x509";
23
0
    return NULL;
24
0
}
25
FuEfiSignatureKind
26
fu_efi_signature_kind_from_string(const gchar *val)
27
0
{
28
0
    if (g_strcmp0(val, "unknown") == 0)
29
0
        return FU_EFI_SIGNATURE_KIND_UNKNOWN;
30
0
    if (g_strcmp0(val, "sha256") == 0)
31
0
        return FU_EFI_SIGNATURE_KIND_SHA256;
32
0
    if (g_strcmp0(val, "x509") == 0)
33
0
        return FU_EFI_SIGNATURE_KIND_X509;
34
0
    return FU_EFI_SIGNATURE_KIND_UNKNOWN;
35
0
}
36
37
38
const gchar *
39
fu_efi_file_type_to_string(FuEfiFileType val)
40
0
{
41
0
    if (val == FU_EFI_FILE_TYPE_ALL)
42
0
        return "all";
43
0
    if (val == FU_EFI_FILE_TYPE_RAW)
44
0
        return "raw";
45
0
    if (val == FU_EFI_FILE_TYPE_FREEFORM)
46
0
        return "freeform";
47
0
    if (val == FU_EFI_FILE_TYPE_SECURITY_CORE)
48
0
        return "security-core";
49
0
    if (val == FU_EFI_FILE_TYPE_PEI_CORE)
50
0
        return "pei-core";
51
0
    if (val == FU_EFI_FILE_TYPE_DXE_CORE)
52
0
        return "dxe-core";
53
0
    if (val == FU_EFI_FILE_TYPE_PEIM)
54
0
        return "peim";
55
0
    if (val == FU_EFI_FILE_TYPE_DRIVER)
56
0
        return "driver";
57
0
    if (val == FU_EFI_FILE_TYPE_COMBINED_PEIM_DRIVER)
58
0
        return "combined-peim-driver";
59
0
    if (val == FU_EFI_FILE_TYPE_APPLICATION)
60
0
        return "application";
61
0
    if (val == FU_EFI_FILE_TYPE_MM)
62
0
        return "mm";
63
0
    if (val == FU_EFI_FILE_TYPE_FIRMWARE_VOLUME_IMAGE)
64
0
        return "firmware-volume-image";
65
0
    if (val == FU_EFI_FILE_TYPE_COMBINED_MM_DXE)
66
0
        return "combined-mm-dxe";
67
0
    if (val == FU_EFI_FILE_TYPE_MM_CORE)
68
0
        return "mm-core";
69
0
    if (val == FU_EFI_FILE_TYPE_MM_STANDALONE)
70
0
        return "mm-standalone";
71
0
    if (val == FU_EFI_FILE_TYPE_MM_CORE_STANDALONE)
72
0
        return "mm-core-standalone";
73
0
    if (val == FU_EFI_FILE_TYPE_FFS_PAD)
74
0
        return "ffs-pad";
75
0
    return NULL;
76
0
}
77
78
static const gchar *
79
fu_efi_compression_type_to_string(FuEfiCompressionType val)
80
0
{
81
0
    if (val == FU_EFI_COMPRESSION_TYPE_NOT_COMPRESSED)
82
0
        return "not-compressed";
83
0
    if (val == FU_EFI_COMPRESSION_TYPE_STANDARD_COMPRESSION)
84
0
        return "standard-compression";
85
0
    return NULL;
86
0
}
87
88
const gchar *
89
fu_efi_lz77_decompressor_version_to_string(FuEfiLz77DecompressorVersion val)
90
3.65k
{
91
3.65k
    if (val == FU_EFI_LZ77_DECOMPRESSOR_VERSION_NONE)
92
0
        return "none";
93
3.65k
    if (val == FU_EFI_LZ77_DECOMPRESSOR_VERSION_LEGACY)
94
2.25k
        return "legacy";
95
1.39k
    if (val == FU_EFI_LZ77_DECOMPRESSOR_VERSION_TIANO)
96
1.39k
        return "tiano";
97
0
    return NULL;
98
1.39k
}
99
100
const gchar *
101
fu_efi_section_type_to_string(FuEfiSectionType val)
102
31.7k
{
103
31.7k
    if (val == FU_EFI_SECTION_TYPE_COMPRESSION)
104
0
        return "compression";
105
31.7k
    if (val == FU_EFI_SECTION_TYPE_GUID_DEFINED)
106
64
        return "guid-defined";
107
31.6k
    if (val == FU_EFI_SECTION_TYPE_DISPOSABLE)
108
446
        return "disposable";
109
31.2k
    if (val == FU_EFI_SECTION_TYPE_PE32)
110
648
        return "pe32";
111
30.6k
    if (val == FU_EFI_SECTION_TYPE_PIC)
112
714
        return "pic";
113
29.8k
    if (val == FU_EFI_SECTION_TYPE_TE)
114
638
        return "te";
115
29.2k
    if (val == FU_EFI_SECTION_TYPE_DXE_DEPEX)
116
290
        return "dxe-depex";
117
28.9k
    if (val == FU_EFI_SECTION_TYPE_VERSION)
118
0
        return "version";
119
28.9k
    if (val == FU_EFI_SECTION_TYPE_USER_INTERFACE)
120
0
        return "user-interface";
121
28.9k
    if (val == FU_EFI_SECTION_TYPE_COMPATIBILITY16)
122
2.60k
        return "compatibility16";
123
26.3k
    if (val == FU_EFI_SECTION_TYPE_VOLUME_IMAGE)
124
0
        return "volume-image";
125
26.3k
    if (val == FU_EFI_SECTION_TYPE_FREEFORM_SUBTYPE_GUID)
126
0
        return "freeform-subtype-guid";
127
26.3k
    if (val == FU_EFI_SECTION_TYPE_RAW)
128
6.89k
        return "raw";
129
19.4k
    if (val == FU_EFI_SECTION_TYPE_PEI_DEPEX)
130
1.30k
        return "pei-depex";
131
18.1k
    if (val == FU_EFI_SECTION_TYPE_MM_DEPEX)
132
347
        return "mm-depex";
133
17.8k
    if (val == FU_EFI_SECTION_TYPE_PHOENIX_SECTION_POSTCODE)
134
1.81k
        return "phoenix-section-postcode";
135
15.9k
    if (val == FU_EFI_SECTION_TYPE_INSYDE_SECTION_POSTCODE)
136
268
        return "insyde-section-postcode";
137
15.7k
    return NULL;
138
15.9k
}
139
140
const gchar *
141
fu_efi_volume_ext_entry_type_to_string(FuEfiVolumeExtEntryType val)
142
0
{
143
0
    if (val == FU_EFI_VOLUME_EXT_ENTRY_TYPE_OEM)
144
0
        return "oem";
145
0
    if (val == FU_EFI_VOLUME_EXT_ENTRY_TYPE_GUID)
146
0
        return "guid";
147
0
    if (val == FU_EFI_VOLUME_EXT_ENTRY_TYPE_SIZE)
148
0
        return "size";
149
0
    return NULL;
150
0
}
151
152
static const gchar *
153
fu_efi_load_option_attrs_to_string(FuEfiLoadOptionAttrs val)
154
0
{
155
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_ACTIVE)
156
0
        return "active";
157
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_FORCE_RECONNECT)
158
0
        return "force-reconnect";
159
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_HIDDEN)
160
0
        return "hidden";
161
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_CATEGORY)
162
0
        return "category";
163
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_CATEGORY_BOOT)
164
0
        return "category-boot";
165
0
    if (val == FU_EFI_LOAD_OPTION_ATTRS_CATEGORY_AP)
166
0
        return "category-ap";
167
0
    return NULL;
168
0
}
169
170
const gchar *
171
fu_efi_load_option_kind_to_string(FuEfiLoadOptionKind val)
172
0
{
173
0
    if (val == FU_EFI_LOAD_OPTION_KIND_UNKNOWN)
174
0
        return "unknown";
175
0
    if (val == FU_EFI_LOAD_OPTION_KIND_PATH)
176
0
        return "path";
177
0
    if (val == FU_EFI_LOAD_OPTION_KIND_HIVE)
178
0
        return "hive";
179
0
    if (val == FU_EFI_LOAD_OPTION_KIND_DATA)
180
0
        return "data";
181
0
    return NULL;
182
0
}
183
FuEfiLoadOptionKind
184
fu_efi_load_option_kind_from_string(const gchar *val)
185
0
{
186
0
    if (g_strcmp0(val, "unknown") == 0)
187
0
        return FU_EFI_LOAD_OPTION_KIND_UNKNOWN;
188
0
    if (g_strcmp0(val, "path") == 0)
189
0
        return FU_EFI_LOAD_OPTION_KIND_PATH;
190
0
    if (g_strcmp0(val, "hive") == 0)
191
0
        return FU_EFI_LOAD_OPTION_KIND_HIVE;
192
0
    if (g_strcmp0(val, "data") == 0)
193
0
        return FU_EFI_LOAD_OPTION_KIND_DATA;
194
0
    return FU_EFI_LOAD_OPTION_KIND_UNKNOWN;
195
0
}
196
197
static const gchar *
198
fu_efi_device_path_type_to_string(FuEfiDevicePathType val)
199
0
{
200
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_HARDWARE)
201
0
        return "hardware";
202
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_ACPI)
203
0
        return "acpi";
204
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_MESSAGE)
205
0
        return "message";
206
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_MEDIA)
207
0
        return "media";
208
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_BIOS_BOOT)
209
0
        return "bios-boot";
210
0
    if (val == FU_EFI_DEVICE_PATH_TYPE_END)
211
0
        return "end";
212
0
    return NULL;
213
0
}
214
215
static const gchar *
216
fu_efi_hard_drive_device_path_subtype_to_string(FuEfiHardDriveDevicePathSubtype val)
217
0
{
218
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_HARD_DRIVE)
219
0
        return "hard-drive";
220
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_CDROM)
221
0
        return "cdrom";
222
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_VENDOR)
223
0
        return "vendor";
224
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_FILE_PATH)
225
0
        return "file-path";
226
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_MEDIA_PROTOCOL)
227
0
        return "media-protocol";
228
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_PIWG_FIRMWARE_FILE)
229
0
        return "piwg-firmware-file";
230
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_PIWG_FIRMWARE_VOLUME)
231
0
        return "piwg-firmware-volume";
232
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_RELATIVE_OFFSET_RANGE)
233
0
        return "relative-offset-range";
234
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_RAM_DISK_DEVICE_PATH)
235
0
        return "ram-disk-device-path";
236
0
    return NULL;
237
0
}
238
239
const gchar *
240
fu_efi_hard_drive_device_path_partition_format_to_string(FuEfiHardDriveDevicePathPartitionFormat val)
241
0
{
242
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_LEGACY_MBR)
243
0
        return "legacy-mbr";
244
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_GUID_PARTITION_TABLE)
245
0
        return "guid-partition-table";
246
0
    return NULL;
247
0
}
248
FuEfiHardDriveDevicePathPartitionFormat
249
fu_efi_hard_drive_device_path_partition_format_from_string(const gchar *val)
250
0
{
251
0
    if (g_strcmp0(val, "legacy-mbr") == 0)
252
0
        return FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_LEGACY_MBR;
253
0
    if (g_strcmp0(val, "guid-partition-table") == 0)
254
0
        return FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_GUID_PARTITION_TABLE;
255
0
    return FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_LEGACY_MBR;
256
0
}
257
258
const gchar *
259
fu_efi_hard_drive_device_path_signature_type_to_string(FuEfiHardDriveDevicePathSignatureType val)
260
0
{
261
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_NONE)
262
0
        return "none";
263
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_ADDR1B8)
264
0
        return "addr1b8";
265
0
    if (val == FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_GUID)
266
0
        return "guid";
267
0
    return NULL;
268
0
}
269
FuEfiHardDriveDevicePathSignatureType
270
fu_efi_hard_drive_device_path_signature_type_from_string(const gchar *val)
271
0
{
272
0
    if (g_strcmp0(val, "none") == 0)
273
0
        return FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_NONE;
274
0
    if (g_strcmp0(val, "addr1b8") == 0)
275
0
        return FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_ADDR1B8;
276
0
    if (g_strcmp0(val, "guid") == 0)
277
0
        return FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_GUID;
278
0
    return FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_NONE;
279
0
}
280
281
const gchar *
282
fu_efi_variable_store_state_to_string(FuEfiVariableStoreState val)
283
0
{
284
0
    if (val == FU_EFI_VARIABLE_STORE_STATE_UNSET)
285
0
        return "unset";
286
0
    if (val == FU_EFI_VARIABLE_STORE_STATE_HEALTHY)
287
0
        return "healthy";
288
0
    if (val == FU_EFI_VARIABLE_STORE_STATE_EMPTY)
289
0
        return "empty";
290
0
    return NULL;
291
0
}
292
FuEfiVariableStoreState
293
fu_efi_variable_store_state_from_string(const gchar *val)
294
0
{
295
0
    if (g_strcmp0(val, "unset") == 0)
296
0
        return FU_EFI_VARIABLE_STORE_STATE_UNSET;
297
0
    if (g_strcmp0(val, "healthy") == 0)
298
0
        return FU_EFI_VARIABLE_STORE_STATE_HEALTHY;
299
0
    if (g_strcmp0(val, "empty") == 0)
300
0
        return FU_EFI_VARIABLE_STORE_STATE_EMPTY;
301
0
    return FU_EFI_VARIABLE_STORE_STATE_UNSET;
302
0
}
303
304
305
const gchar *
306
fu_efi_variable_state_to_string(FuEfiVariableState val)
307
0
{
308
0
    if (val == FU_EFI_VARIABLE_STATE_UNSET)
309
0
        return "unset";
310
0
    if (val == FU_EFI_VARIABLE_STATE_VARIABLE_IN_DELETED_TRANSITION)
311
0
        return "variable-in-deleted-transition";
312
0
    if (val == FU_EFI_VARIABLE_STATE_VARIABLE_DELETED)
313
0
        return "variable-deleted";
314
0
    if (val == FU_EFI_VARIABLE_STATE_VARIABLE_HEADER_VALID)
315
0
        return "variable-header-valid";
316
0
    if (val == FU_EFI_VARIABLE_STATE_VARIABLE_ADDED)
317
0
        return "variable-added";
318
0
    if (val == FU_EFI_VARIABLE_STATE_INTEL_VARIABLE_VALID)
319
0
        return "intel-variable-valid";
320
0
    if (val == FU_EFI_VARIABLE_STATE_INTEL_VARIABLE_INVALID)
321
0
        return "intel-variable-invalid";
322
0
    return NULL;
323
0
}
324
FuEfiVariableState
325
fu_efi_variable_state_from_string(const gchar *val)
326
0
{
327
0
    if (g_strcmp0(val, "unset") == 0)
328
0
        return FU_EFI_VARIABLE_STATE_UNSET;
329
0
    if (g_strcmp0(val, "variable-in-deleted-transition") == 0)
330
0
        return FU_EFI_VARIABLE_STATE_VARIABLE_IN_DELETED_TRANSITION;
331
0
    if (g_strcmp0(val, "variable-deleted") == 0)
332
0
        return FU_EFI_VARIABLE_STATE_VARIABLE_DELETED;
333
0
    if (g_strcmp0(val, "variable-header-valid") == 0)
334
0
        return FU_EFI_VARIABLE_STATE_VARIABLE_HEADER_VALID;
335
0
    if (g_strcmp0(val, "variable-added") == 0)
336
0
        return FU_EFI_VARIABLE_STATE_VARIABLE_ADDED;
337
0
    if (g_strcmp0(val, "intel-variable-valid") == 0)
338
0
        return FU_EFI_VARIABLE_STATE_INTEL_VARIABLE_VALID;
339
0
    if (g_strcmp0(val, "intel-variable-invalid") == 0)
340
0
        return FU_EFI_VARIABLE_STATE_INTEL_VARIABLE_INVALID;
341
0
    return FU_EFI_VARIABLE_STATE_UNSET;
342
0
}
343
344
gchar *
345
fu_efi_variable_attributes_to_string(FuEfiVariableAttributes val)
346
0
{
347
0
    const gchar *data[8] = {0};
348
0
    guint idx = 0;
349
0
    if (val == FU_EFI_VARIABLE_ATTRIBUTES_NONE)
350
0
        return g_strdup("none");
351
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_NON_VOLATILE)
352
0
        data[idx++] = "non-volatile";
353
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_BOOTSERVICE_ACCESS)
354
0
        data[idx++] = "bootservice-access";
355
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_RUNTIME_ACCESS)
356
0
        data[idx++] = "runtime-access";
357
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_HARDWARE_ERROR_RECORD)
358
0
        data[idx++] = "hardware-error-record";
359
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_AUTHENTICATED_WRITE_ACCESS)
360
0
        data[idx++] = "authenticated-write-access";
361
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
362
0
        data[idx++] = "time-based-authenticated-write-access";
363
0
    if (val & FU_EFI_VARIABLE_ATTRIBUTES_APPEND_WRITE)
364
0
        data[idx++] = "append-write";
365
0
    return g_strjoinv(",", (gchar **)data);
366
0
}
367
FuEfiVariableAttributes
368
fu_efi_variable_attributes_from_string(const gchar *val)
369
0
{
370
0
    FuEfiVariableAttributes value = 0;
371
0
    g_auto(GStrv) split = NULL;
372
0
    g_return_val_if_fail(val != NULL, 0);
373
0
    split = g_strsplit(val, ",", -1);
374
0
    for (guint i = 0; split[i] != NULL; i++) {
375
0
        if (g_strcmp0(split[i], "none") == 0) {
376
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_NONE;
377
0
            continue;
378
0
        }
379
0
        if (g_strcmp0(split[i], "non-volatile") == 0) {
380
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_NON_VOLATILE;
381
0
            continue;
382
0
        }
383
0
        if (g_strcmp0(split[i], "bootservice-access") == 0) {
384
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_BOOTSERVICE_ACCESS;
385
0
            continue;
386
0
        }
387
0
        if (g_strcmp0(split[i], "runtime-access") == 0) {
388
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_RUNTIME_ACCESS;
389
0
            continue;
390
0
        }
391
0
        if (g_strcmp0(split[i], "hardware-error-record") == 0) {
392
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_HARDWARE_ERROR_RECORD;
393
0
            continue;
394
0
        }
395
0
        if (g_strcmp0(split[i], "authenticated-write-access") == 0) {
396
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_AUTHENTICATED_WRITE_ACCESS;
397
0
            continue;
398
0
        }
399
0
        if (g_strcmp0(split[i], "time-based-authenticated-write-access") == 0) {
400
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
401
0
            continue;
402
0
        }
403
0
        if (g_strcmp0(split[i], "append-write") == 0) {
404
0
            value |= FU_EFI_VARIABLE_ATTRIBUTES_APPEND_WRITE;
405
0
            continue;
406
0
        }
407
0
    }
408
0
    return value;
409
0
}
410
/* getters */
411
/**
412
 * fu_struct_efi_file_get_name: (skip):
413
 **/
414
const fwupd_guid_t *
415
fu_struct_efi_file_get_name(const FuStructEfiFile *st)
416
30.2k
{
417
30.2k
    g_return_val_if_fail(st != NULL, NULL);
418
30.2k
    return (const fwupd_guid_t *) (st->data + 0);
419
30.2k
}
420
/**
421
 * fu_struct_efi_file_get_hdr_checksum: (skip):
422
 **/
423
guint8
424
fu_struct_efi_file_get_hdr_checksum(const FuStructEfiFile *st)
425
30.3k
{
426
30.3k
    g_return_val_if_fail(st != NULL, 0x0);
427
30.3k
    return st->data[16];
428
30.3k
}
429
/**
430
 * fu_struct_efi_file_get_data_checksum: (skip):
431
 **/
432
guint8
433
fu_struct_efi_file_get_data_checksum(const FuStructEfiFile *st)
434
818
{
435
818
    g_return_val_if_fail(st != NULL, 0x0);
436
818
    return st->data[17];
437
818
}
438
/**
439
 * fu_struct_efi_file_get_type: (skip):
440
 **/
441
FuEfiFileType
442
fu_struct_efi_file_get_type(const FuStructEfiFile *st)
443
30.2k
{
444
30.2k
    g_return_val_if_fail(st != NULL, 0x0);
445
30.2k
    return st->data[18];
446
30.2k
}
447
/**
448
 * fu_struct_efi_file_get_attrs: (skip):
449
 **/
450
guint8
451
fu_struct_efi_file_get_attrs(const FuStructEfiFile *st)
452
30.2k
{
453
30.2k
    g_return_val_if_fail(st != NULL, 0x0);
454
30.2k
    return st->data[19];
455
30.2k
}
456
/**
457
 * fu_struct_efi_file_get_size: (skip):
458
 **/
459
guint32
460
fu_struct_efi_file_get_size(const FuStructEfiFile *st)
461
30.3k
{
462
30.3k
    g_return_val_if_fail(st != NULL, 0x0);
463
30.3k
    return fu_memread_uint24(st->data + 20, G_LITTLE_ENDIAN);
464
30.3k
}
465
/**
466
 * fu_struct_efi_file_get_state: (skip):
467
 **/
468
guint8
469
fu_struct_efi_file_get_state(const FuStructEfiFile *st)
470
0
{
471
0
    g_return_val_if_fail(st != NULL, 0x0);
472
0
    return st->data[23];
473
0
}
474
475
/* setters */
476
/**
477
 * fu_struct_efi_file_set_name: (skip):
478
 **/
479
void
480
fu_struct_efi_file_set_name(FuStructEfiFile *st, const fwupd_guid_t *value)
481
7.01k
{
482
7.01k
    g_return_if_fail(st != NULL);
483
7.01k
    g_return_if_fail(value != NULL);
484
7.01k
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
485
7.01k
}
486
/**
487
 * fu_struct_efi_file_set_hdr_checksum: (skip):
488
 **/
489
void
490
fu_struct_efi_file_set_hdr_checksum(FuStructEfiFile *st, guint8 value)
491
14.0k
{
492
14.0k
    g_return_if_fail(st != NULL);
493
14.0k
    st->data[16] = value;
494
14.0k
}
495
/**
496
 * fu_struct_efi_file_set_data_checksum: (skip):
497
 **/
498
void
499
fu_struct_efi_file_set_data_checksum(FuStructEfiFile *st, guint8 value)
500
7.01k
{
501
7.01k
    g_return_if_fail(st != NULL);
502
7.01k
    st->data[17] = value;
503
7.01k
}
504
/**
505
 * fu_struct_efi_file_set_type: (skip):
506
 **/
507
void
508
fu_struct_efi_file_set_type(FuStructEfiFile *st, FuEfiFileType value)
509
7.01k
{
510
7.01k
    g_return_if_fail(st != NULL);
511
7.01k
    st->data[18] = value;
512
7.01k
}
513
/**
514
 * fu_struct_efi_file_set_attrs: (skip):
515
 **/
516
void
517
fu_struct_efi_file_set_attrs(FuStructEfiFile *st, guint8 value)
518
7.01k
{
519
7.01k
    g_return_if_fail(st != NULL);
520
7.01k
    st->data[19] = value;
521
7.01k
}
522
/**
523
 * fu_struct_efi_file_set_size: (skip):
524
 **/
525
void
526
fu_struct_efi_file_set_size(FuStructEfiFile *st, guint32 value)
527
7.01k
{
528
7.01k
    g_return_if_fail(st != NULL);
529
7.01k
    fu_memwrite_uint24(st->data + 20, value, G_LITTLE_ENDIAN);
530
7.01k
}
531
/**
532
 * fu_struct_efi_file_set_state: (skip):
533
 **/
534
void
535
fu_struct_efi_file_set_state(FuStructEfiFile *st, guint8 value)
536
7.40k
{
537
7.40k
    g_return_if_fail(st != NULL);
538
7.40k
    st->data[23] = value;
539
7.40k
}
540
/**
541
 * fu_struct_efi_file_new: (skip):
542
 **/
543
FuStructEfiFile *
544
fu_struct_efi_file_new(void)
545
7.40k
{
546
7.40k
    FuStructEfiFile *st = g_byte_array_sized_new(24);
547
7.40k
    fu_byte_array_set_size(st, 24, 0x0);
548
7.40k
    fu_struct_efi_file_set_state(st, 0xF8);
549
7.40k
    return st;
550
7.40k
}
551
/**
552
 * fu_struct_efi_file_to_string: (skip):
553
 **/
554
static gchar *
555
fu_struct_efi_file_to_string(const FuStructEfiFile *st)
556
0
{
557
0
    g_autoptr(GString) str = g_string_new("FuStructEfiFile:\n");
558
0
    g_return_val_if_fail(st != NULL, NULL);
559
0
    {
560
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_file_get_name(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
561
0
        g_string_append_printf(str, "  name: %s\n", tmp);
562
0
    }
563
0
    g_string_append_printf(str, "  hdr_checksum: 0x%x\n",
564
0
                           (guint) fu_struct_efi_file_get_hdr_checksum(st));
565
0
    g_string_append_printf(str, "  data_checksum: 0x%x\n",
566
0
                           (guint) fu_struct_efi_file_get_data_checksum(st));
567
0
    {
568
0
        const gchar *tmp = fu_efi_file_type_to_string(fu_struct_efi_file_get_type(st));
569
0
        if (tmp != NULL) {
570
0
            g_string_append_printf(str, "  type: 0x%x [%s]\n", (guint) fu_struct_efi_file_get_type(st), tmp);
571
0
        } else {
572
0
            g_string_append_printf(str, "  type: 0x%x\n", (guint) fu_struct_efi_file_get_type(st));
573
0
        }
574
0
    }
575
0
    g_string_append_printf(str, "  attrs: 0x%x\n",
576
0
                           (guint) fu_struct_efi_file_get_attrs(st));
577
0
    g_string_append_printf(str, "  size: 0x%x\n",
578
0
                           (guint) fu_struct_efi_file_get_size(st));
579
0
    g_string_append_printf(str, "  state: 0x%x\n",
580
0
                           (guint) fu_struct_efi_file_get_state(st));
581
0
    if (str->len > 0)
582
0
        g_string_set_size(str, str->len - 1);
583
0
    return g_string_free(g_steal_pointer(&str), FALSE);
584
0
}
585
static gboolean
586
fu_struct_efi_file_validate_internal(FuStructEfiFile *st, GError **error)
587
30.4k
{
588
30.4k
    g_return_val_if_fail(st != NULL, FALSE);
589
30.4k
    return TRUE;
590
30.4k
}
591
/**
592
 * fu_struct_efi_file_validate: (skip):
593
 **/
594
gboolean
595
fu_struct_efi_file_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
596
0
{
597
0
    GByteArray st = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
598
0
    g_return_val_if_fail(buf != NULL, FALSE);
599
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
600
0
    if (!fu_memchk_read(bufsz, offset, 24, error)) {
601
0
        g_prefix_error_literal(error, "invalid struct FuStructEfiFile: ");
602
0
        return FALSE;
603
0
    }
604
0
    if (!fu_struct_efi_file_validate_internal(&st, error))
605
0
        return FALSE;
606
0
    return TRUE;
607
0
}
608
static gboolean
609
fu_struct_efi_file_parse_internal(FuStructEfiFile *st, GError **error)
610
30.2k
{
611
30.2k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
612
0
        g_autofree gchar *str = fu_struct_efi_file_to_string(st);
613
0
        g_debug("%s", str);
614
0
    }
615
30.2k
    if (!fu_struct_efi_file_validate_internal(st, error))
616
0
        return FALSE;
617
30.2k
    return TRUE;
618
30.2k
}
619
/**
620
 * fu_struct_efi_file_parse_stream: (skip):
621
 **/
622
FuStructEfiFile *
623
fu_struct_efi_file_parse_stream(GInputStream *stream, gsize offset, GError **error)
624
30.3k
{
625
30.3k
    g_autoptr(GByteArray) st = NULL;
626
30.3k
    st = fu_input_stream_read_byte_array(stream, offset, 24, NULL, error);
627
30.3k
    if (st == NULL) {
628
0
        g_prefix_error(error, "FuStructEfiFile failed read of 0x%x: ", (guint) 24);
629
0
        return NULL;
630
0
    }
631
30.3k
    if (st->len != 24) {
632
109
        g_set_error(error,
633
109
                    FWUPD_ERROR,
634
109
                    FWUPD_ERROR_INVALID_DATA,
635
109
                    "FuStructEfiFile requested 0x%x and got 0x%x",
636
109
                    (guint) 24,
637
109
                    (guint) st->len);
638
109
        return NULL;
639
109
    }
640
30.2k
    if (!fu_struct_efi_file_parse_internal(st, error))
641
0
        return NULL;
642
30.2k
    return g_steal_pointer(&st);
643
30.2k
}
644
/* getters */
645
/**
646
 * fu_struct_efi_file2_get_extended_size: (skip):
647
 **/
648
guint64
649
fu_struct_efi_file2_get_extended_size(const FuStructEfiFile2 *st)
650
179
{
651
179
    g_return_val_if_fail(st != NULL, 0x0);
652
179
    return fu_memread_uint64(st->data + 24, G_LITTLE_ENDIAN);
653
179
}
654
655
/* setters */
656
/**
657
 * fu_struct_efi_file2_to_string: (skip):
658
 **/
659
static gchar *
660
fu_struct_efi_file2_to_string(const FuStructEfiFile2 *st)
661
0
{
662
0
    g_autoptr(GString) str = g_string_new("FuStructEfiFile2:\n");
663
0
    g_return_val_if_fail(st != NULL, NULL);
664
0
    g_string_append_printf(str, "  extended_size: 0x%x\n",
665
0
                           (guint) fu_struct_efi_file2_get_extended_size(st));
666
0
    if (str->len > 0)
667
0
        g_string_set_size(str, str->len - 1);
668
0
    return g_string_free(g_steal_pointer(&str), FALSE);
669
0
}
670
static gboolean
671
fu_struct_efi_file2_validate_internal(FuStructEfiFile2 *st, GError **error)
672
179
{
673
179
    g_return_val_if_fail(st != NULL, FALSE);
674
179
    {
675
179
        GByteArray st_tmp = {
676
179
            .data = (guint8*) st->data + 0x0,
677
179
            .len = 24,
678
179
        };
679
179
        if (!fu_struct_efi_file_validate_internal(&st_tmp, error))
680
0
            return FALSE;
681
179
    }
682
179
    return TRUE;
683
179
}
684
static gboolean
685
fu_struct_efi_file2_parse_internal(FuStructEfiFile2 *st, GError **error)
686
179
{
687
179
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
688
0
        g_autofree gchar *str = fu_struct_efi_file2_to_string(st);
689
0
        g_debug("%s", str);
690
0
    }
691
179
    if (!fu_struct_efi_file2_validate_internal(st, error))
692
0
        return FALSE;
693
179
    return TRUE;
694
179
}
695
/**
696
 * fu_struct_efi_file2_parse_stream: (skip):
697
 **/
698
FuStructEfiFile2 *
699
fu_struct_efi_file2_parse_stream(GInputStream *stream, gsize offset, GError **error)
700
188
{
701
188
    g_autoptr(GByteArray) st = NULL;
702
188
    st = fu_input_stream_read_byte_array(stream, offset, 32, NULL, error);
703
188
    if (st == NULL) {
704
0
        g_prefix_error(error, "FuStructEfiFile2 failed read of 0x%x: ", (guint) 32);
705
0
        return NULL;
706
0
    }
707
188
    if (st->len != 32) {
708
9
        g_set_error(error,
709
9
                    FWUPD_ERROR,
710
9
                    FWUPD_ERROR_INVALID_DATA,
711
9
                    "FuStructEfiFile2 requested 0x%x and got 0x%x",
712
9
                    (guint) 32,
713
9
                    (guint) st->len);
714
9
        return NULL;
715
9
    }
716
179
    if (!fu_struct_efi_file2_parse_internal(st, error))
717
0
        return NULL;
718
179
    return g_steal_pointer(&st);
719
179
}
720
/* getters */
721
/**
722
 * fu_struct_efi_section_compression_get_uncompressed_length: (skip):
723
 **/
724
guint32
725
fu_struct_efi_section_compression_get_uncompressed_length(const FuStructEfiSectionCompression *st)
726
0
{
727
0
    g_return_val_if_fail(st != NULL, 0x0);
728
0
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
729
0
}
730
/**
731
 * fu_struct_efi_section_compression_get_compression_type: (skip):
732
 **/
733
FuEfiCompressionType
734
fu_struct_efi_section_compression_get_compression_type(const FuStructEfiSectionCompression *st)
735
3.48k
{
736
3.48k
    g_return_val_if_fail(st != NULL, 0x0);
737
3.48k
    return st->data[4];
738
3.48k
}
739
740
/* setters */
741
/**
742
 * fu_struct_efi_section_compression_to_string: (skip):
743
 **/
744
static gchar *
745
fu_struct_efi_section_compression_to_string(const FuStructEfiSectionCompression *st)
746
0
{
747
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSectionCompression:\n");
748
0
    g_return_val_if_fail(st != NULL, NULL);
749
0
    g_string_append_printf(str, "  uncompressed_length: 0x%x\n",
750
0
                           (guint) fu_struct_efi_section_compression_get_uncompressed_length(st));
751
0
    {
752
0
        const gchar *tmp = fu_efi_compression_type_to_string(fu_struct_efi_section_compression_get_compression_type(st));
753
0
        if (tmp != NULL) {
754
0
            g_string_append_printf(str, "  compression_type: 0x%x [%s]\n", (guint) fu_struct_efi_section_compression_get_compression_type(st), tmp);
755
0
        } else {
756
0
            g_string_append_printf(str, "  compression_type: 0x%x\n", (guint) fu_struct_efi_section_compression_get_compression_type(st));
757
0
        }
758
0
    }
759
0
    if (str->len > 0)
760
0
        g_string_set_size(str, str->len - 1);
761
0
    return g_string_free(g_steal_pointer(&str), FALSE);
762
0
}
763
static gboolean
764
fu_struct_efi_section_compression_validate_internal(FuStructEfiSectionCompression *st, GError **error)
765
3.48k
{
766
3.48k
    g_return_val_if_fail(st != NULL, FALSE);
767
3.48k
    return TRUE;
768
3.48k
}
769
static gboolean
770
fu_struct_efi_section_compression_parse_internal(FuStructEfiSectionCompression *st, GError **error)
771
3.48k
{
772
3.48k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
773
0
        g_autofree gchar *str = fu_struct_efi_section_compression_to_string(st);
774
0
        g_debug("%s", str);
775
0
    }
776
3.48k
    if (!fu_struct_efi_section_compression_validate_internal(st, error))
777
0
        return FALSE;
778
3.48k
    return TRUE;
779
3.48k
}
780
/**
781
 * fu_struct_efi_section_compression_parse_stream: (skip):
782
 **/
783
FuStructEfiSectionCompression *
784
fu_struct_efi_section_compression_parse_stream(GInputStream *stream, gsize offset, GError **error)
785
3.51k
{
786
3.51k
    g_autoptr(GByteArray) st = NULL;
787
3.51k
    st = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
788
3.51k
    if (st == NULL) {
789
8
        g_prefix_error(error, "FuStructEfiSectionCompression failed read of 0x%x: ", (guint) 5);
790
8
        return NULL;
791
8
    }
792
3.50k
    if (st->len != 5) {
793
16
        g_set_error(error,
794
16
                    FWUPD_ERROR,
795
16
                    FWUPD_ERROR_INVALID_DATA,
796
16
                    "FuStructEfiSectionCompression requested 0x%x and got 0x%x",
797
16
                    (guint) 5,
798
16
                    (guint) st->len);
799
16
        return NULL;
800
16
    }
801
3.48k
    if (!fu_struct_efi_section_compression_parse_internal(st, error))
802
0
        return NULL;
803
3.48k
    return g_steal_pointer(&st);
804
3.48k
}
805
/* getters */
806
/**
807
 * fu_struct_efi_lz77_decompressor_header_get_src_size: (skip):
808
 **/
809
guint32
810
fu_struct_efi_lz77_decompressor_header_get_src_size(const FuStructEfiLz77DecompressorHeader *st)
811
3.19k
{
812
3.19k
    g_return_val_if_fail(st != NULL, 0x0);
813
3.19k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
814
3.19k
}
815
/**
816
 * fu_struct_efi_lz77_decompressor_header_get_dst_size: (skip):
817
 **/
818
guint32
819
fu_struct_efi_lz77_decompressor_header_get_dst_size(const FuStructEfiLz77DecompressorHeader *st)
820
3.11k
{
821
3.11k
    g_return_val_if_fail(st != NULL, 0x0);
822
3.11k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
823
3.11k
}
824
825
/* setters */
826
/**
827
 * fu_struct_efi_lz77_decompressor_header_to_string: (skip):
828
 **/
829
static gchar *
830
fu_struct_efi_lz77_decompressor_header_to_string(const FuStructEfiLz77DecompressorHeader *st)
831
0
{
832
0
    g_autoptr(GString) str = g_string_new("FuStructEfiLz77DecompressorHeader:\n");
833
0
    g_return_val_if_fail(st != NULL, NULL);
834
0
    g_string_append_printf(str, "  src_size: 0x%x\n",
835
0
                           (guint) fu_struct_efi_lz77_decompressor_header_get_src_size(st));
836
0
    g_string_append_printf(str, "  dst_size: 0x%x\n",
837
0
                           (guint) fu_struct_efi_lz77_decompressor_header_get_dst_size(st));
838
0
    if (str->len > 0)
839
0
        g_string_set_size(str, str->len - 1);
840
0
    return g_string_free(g_steal_pointer(&str), FALSE);
841
0
}
842
static gboolean
843
fu_struct_efi_lz77_decompressor_header_validate_internal(FuStructEfiLz77DecompressorHeader *st, GError **error)
844
3.19k
{
845
3.19k
    g_return_val_if_fail(st != NULL, FALSE);
846
3.19k
    return TRUE;
847
3.19k
}
848
static gboolean
849
fu_struct_efi_lz77_decompressor_header_parse_internal(FuStructEfiLz77DecompressorHeader *st, GError **error)
850
3.19k
{
851
3.19k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
852
0
        g_autofree gchar *str = fu_struct_efi_lz77_decompressor_header_to_string(st);
853
0
        g_debug("%s", str);
854
0
    }
855
3.19k
    if (!fu_struct_efi_lz77_decompressor_header_validate_internal(st, error))
856
0
        return FALSE;
857
3.19k
    return TRUE;
858
3.19k
}
859
/**
860
 * fu_struct_efi_lz77_decompressor_header_parse_stream: (skip):
861
 **/
862
FuStructEfiLz77DecompressorHeader *
863
fu_struct_efi_lz77_decompressor_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
864
3.22k
{
865
3.22k
    g_autoptr(GByteArray) st = NULL;
866
3.22k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
867
3.22k
    if (st == NULL) {
868
1
        g_prefix_error(error, "FuStructEfiLz77DecompressorHeader failed read of 0x%x: ", (guint) 8);
869
1
        return NULL;
870
1
    }
871
3.22k
    if (st->len != 8) {
872
25
        g_set_error(error,
873
25
                    FWUPD_ERROR,
874
25
                    FWUPD_ERROR_INVALID_DATA,
875
25
                    "FuStructEfiLz77DecompressorHeader requested 0x%x and got 0x%x",
876
25
                    (guint) 8,
877
25
                    (guint) st->len);
878
25
        return NULL;
879
25
    }
880
3.19k
    if (!fu_struct_efi_lz77_decompressor_header_parse_internal(st, error))
881
0
        return NULL;
882
3.19k
    return g_steal_pointer(&st);
883
3.19k
}
884
/* getters */
885
/**
886
 * fu_struct_efi_section_get_size: (skip):
887
 **/
888
guint32
889
fu_struct_efi_section_get_size(const FuStructEfiSection *st)
890
92.9k
{
891
92.9k
    g_return_val_if_fail(st != NULL, 0x0);
892
92.9k
    return fu_memread_uint24(st->data + 0, G_LITTLE_ENDIAN);
893
92.9k
}
894
/**
895
 * fu_struct_efi_section_get_type: (skip):
896
 **/
897
FuEfiSectionType
898
fu_struct_efi_section_get_type(const FuStructEfiSection *st)
899
46.4k
{
900
46.4k
    g_return_val_if_fail(st != NULL, 0x0);
901
46.4k
    return st->data[3];
902
46.4k
}
903
904
/* setters */
905
/**
906
 * fu_struct_efi_section_set_size: (skip):
907
 **/
908
void
909
fu_struct_efi_section_set_size(FuStructEfiSection *st, guint32 value)
910
8.08k
{
911
8.08k
    g_return_if_fail(st != NULL);
912
8.08k
    fu_memwrite_uint24(st->data + 0, value, G_LITTLE_ENDIAN);
913
8.08k
}
914
/**
915
 * fu_struct_efi_section_set_type: (skip):
916
 **/
917
void
918
fu_struct_efi_section_set_type(FuStructEfiSection *st, FuEfiSectionType value)
919
8.08k
{
920
8.08k
    g_return_if_fail(st != NULL);
921
8.08k
    st->data[3] = value;
922
8.08k
}
923
/**
924
 * fu_struct_efi_section_new: (skip):
925
 **/
926
FuStructEfiSection *
927
fu_struct_efi_section_new(void)
928
8.42k
{
929
8.42k
    FuStructEfiSection *st = g_byte_array_sized_new(4);
930
8.42k
    fu_byte_array_set_size(st, 4, 0x0);
931
8.42k
    return st;
932
8.42k
}
933
/**
934
 * fu_struct_efi_section_to_string: (skip):
935
 **/
936
static gchar *
937
fu_struct_efi_section_to_string(const FuStructEfiSection *st)
938
0
{
939
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSection:\n");
940
0
    g_return_val_if_fail(st != NULL, NULL);
941
0
    g_string_append_printf(str, "  size: 0x%x\n",
942
0
                           (guint) fu_struct_efi_section_get_size(st));
943
0
    {
944
0
        const gchar *tmp = fu_efi_section_type_to_string(fu_struct_efi_section_get_type(st));
945
0
        if (tmp != NULL) {
946
0
            g_string_append_printf(str, "  type: 0x%x [%s]\n", (guint) fu_struct_efi_section_get_type(st), tmp);
947
0
        } else {
948
0
            g_string_append_printf(str, "  type: 0x%x\n", (guint) fu_struct_efi_section_get_type(st));
949
0
        }
950
0
    }
951
0
    if (str->len > 0)
952
0
        g_string_set_size(str, str->len - 1);
953
0
    return g_string_free(g_steal_pointer(&str), FALSE);
954
0
}
955
static gboolean
956
fu_struct_efi_section_validate_internal(FuStructEfiSection *st, GError **error)
957
48.5k
{
958
48.5k
    g_return_val_if_fail(st != NULL, FALSE);
959
48.5k
    return TRUE;
960
48.5k
}
961
static gboolean
962
fu_struct_efi_section_parse_internal(FuStructEfiSection *st, GError **error)
963
47.1k
{
964
47.1k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
965
0
        g_autofree gchar *str = fu_struct_efi_section_to_string(st);
966
0
        g_debug("%s", str);
967
0
    }
968
47.1k
    if (!fu_struct_efi_section_validate_internal(st, error))
969
0
        return FALSE;
970
47.1k
    return TRUE;
971
47.1k
}
972
/**
973
 * fu_struct_efi_section_parse_stream: (skip):
974
 **/
975
FuStructEfiSection *
976
fu_struct_efi_section_parse_stream(GInputStream *stream, gsize offset, GError **error)
977
47.3k
{
978
47.3k
    g_autoptr(GByteArray) st = NULL;
979
47.3k
    st = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
980
47.3k
    if (st == NULL) {
981
167
        g_prefix_error(error, "FuStructEfiSection failed read of 0x%x: ", (guint) 4);
982
167
        return NULL;
983
167
    }
984
47.2k
    if (st->len != 4) {
985
60
        g_set_error(error,
986
60
                    FWUPD_ERROR,
987
60
                    FWUPD_ERROR_INVALID_DATA,
988
60
                    "FuStructEfiSection requested 0x%x and got 0x%x",
989
60
                    (guint) 4,
990
60
                    (guint) st->len);
991
60
        return NULL;
992
60
    }
993
47.1k
    if (!fu_struct_efi_section_parse_internal(st, error))
994
0
        return NULL;
995
47.1k
    return g_steal_pointer(&st);
996
47.1k
}
997
/* getters */
998
/**
999
 * fu_struct_efi_section2_get_extended_size: (skip):
1000
 **/
1001
guint32
1002
fu_struct_efi_section2_get_extended_size(const FuStructEfiSection2 *st)
1003
1.34k
{
1004
1.34k
    g_return_val_if_fail(st != NULL, 0x0);
1005
1.34k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
1006
1.34k
}
1007
1008
/* setters */
1009
/**
1010
 * fu_struct_efi_section2_to_string: (skip):
1011
 **/
1012
static gchar *
1013
fu_struct_efi_section2_to_string(const FuStructEfiSection2 *st)
1014
0
{
1015
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSection2:\n");
1016
0
    g_return_val_if_fail(st != NULL, NULL);
1017
0
    g_string_append_printf(str, "  extended_size: 0x%x\n",
1018
0
                           (guint) fu_struct_efi_section2_get_extended_size(st));
1019
0
    if (str->len > 0)
1020
0
        g_string_set_size(str, str->len - 1);
1021
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1022
0
}
1023
static gboolean
1024
fu_struct_efi_section2_validate_internal(FuStructEfiSection2 *st, GError **error)
1025
1.34k
{
1026
1.34k
    g_return_val_if_fail(st != NULL, FALSE);
1027
1.34k
    {
1028
1.34k
        GByteArray st_tmp = {
1029
1.34k
            .data = (guint8*) st->data + 0x0,
1030
1.34k
            .len = 4,
1031
1.34k
        };
1032
1.34k
        if (!fu_struct_efi_section_validate_internal(&st_tmp, error))
1033
0
            return FALSE;
1034
1.34k
    }
1035
1.34k
    return TRUE;
1036
1.34k
}
1037
static gboolean
1038
fu_struct_efi_section2_parse_internal(FuStructEfiSection2 *st, GError **error)
1039
1.34k
{
1040
1.34k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1041
0
        g_autofree gchar *str = fu_struct_efi_section2_to_string(st);
1042
0
        g_debug("%s", str);
1043
0
    }
1044
1.34k
    if (!fu_struct_efi_section2_validate_internal(st, error))
1045
0
        return FALSE;
1046
1.34k
    return TRUE;
1047
1.34k
}
1048
/**
1049
 * fu_struct_efi_section2_parse_stream: (skip):
1050
 **/
1051
FuStructEfiSection2 *
1052
fu_struct_efi_section2_parse_stream(GInputStream *stream, gsize offset, GError **error)
1053
1.36k
{
1054
1.36k
    g_autoptr(GByteArray) st = NULL;
1055
1.36k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1056
1.36k
    if (st == NULL) {
1057
0
        g_prefix_error(error, "FuStructEfiSection2 failed read of 0x%x: ", (guint) 8);
1058
0
        return NULL;
1059
0
    }
1060
1.36k
    if (st->len != 8) {
1061
20
        g_set_error(error,
1062
20
                    FWUPD_ERROR,
1063
20
                    FWUPD_ERROR_INVALID_DATA,
1064
20
                    "FuStructEfiSection2 requested 0x%x and got 0x%x",
1065
20
                    (guint) 8,
1066
20
                    (guint) st->len);
1067
20
        return NULL;
1068
20
    }
1069
1.34k
    if (!fu_struct_efi_section2_parse_internal(st, error))
1070
0
        return NULL;
1071
1.34k
    return g_steal_pointer(&st);
1072
1.34k
}
1073
/* getters */
1074
/**
1075
 * fu_struct_efi_section_freeform_subtype_guid_get_guid: (skip):
1076
 **/
1077
const fwupd_guid_t *
1078
fu_struct_efi_section_freeform_subtype_guid_get_guid(const FuStructEfiSectionFreeformSubtypeGuid *st)
1079
323
{
1080
323
    g_return_val_if_fail(st != NULL, NULL);
1081
323
    return (const fwupd_guid_t *) (st->data + 0);
1082
323
}
1083
1084
/* setters */
1085
/**
1086
 * fu_struct_efi_section_freeform_subtype_guid_to_string: (skip):
1087
 **/
1088
static gchar *
1089
fu_struct_efi_section_freeform_subtype_guid_to_string(const FuStructEfiSectionFreeformSubtypeGuid *st)
1090
0
{
1091
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSectionFreeformSubtypeGuid:\n");
1092
0
    g_return_val_if_fail(st != NULL, NULL);
1093
0
    {
1094
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_section_freeform_subtype_guid_get_guid(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
1095
0
        g_string_append_printf(str, "  guid: %s\n", tmp);
1096
0
    }
1097
0
    if (str->len > 0)
1098
0
        g_string_set_size(str, str->len - 1);
1099
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1100
0
}
1101
static gboolean
1102
fu_struct_efi_section_freeform_subtype_guid_validate_internal(FuStructEfiSectionFreeformSubtypeGuid *st, GError **error)
1103
323
{
1104
323
    g_return_val_if_fail(st != NULL, FALSE);
1105
323
    return TRUE;
1106
323
}
1107
static gboolean
1108
fu_struct_efi_section_freeform_subtype_guid_parse_internal(FuStructEfiSectionFreeformSubtypeGuid *st, GError **error)
1109
323
{
1110
323
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1111
0
        g_autofree gchar *str = fu_struct_efi_section_freeform_subtype_guid_to_string(st);
1112
0
        g_debug("%s", str);
1113
0
    }
1114
323
    if (!fu_struct_efi_section_freeform_subtype_guid_validate_internal(st, error))
1115
0
        return FALSE;
1116
323
    return TRUE;
1117
323
}
1118
/**
1119
 * fu_struct_efi_section_freeform_subtype_guid_parse_stream: (skip):
1120
 **/
1121
FuStructEfiSectionFreeformSubtypeGuid *
1122
fu_struct_efi_section_freeform_subtype_guid_parse_stream(GInputStream *stream, gsize offset, GError **error)
1123
340
{
1124
340
    g_autoptr(GByteArray) st = NULL;
1125
340
    st = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
1126
340
    if (st == NULL) {
1127
4
        g_prefix_error(error, "FuStructEfiSectionFreeformSubtypeGuid failed read of 0x%x: ", (guint) 16);
1128
4
        return NULL;
1129
4
    }
1130
336
    if (st->len != 16) {
1131
13
        g_set_error(error,
1132
13
                    FWUPD_ERROR,
1133
13
                    FWUPD_ERROR_INVALID_DATA,
1134
13
                    "FuStructEfiSectionFreeformSubtypeGuid requested 0x%x and got 0x%x",
1135
13
                    (guint) 16,
1136
13
                    (guint) st->len);
1137
13
        return NULL;
1138
13
    }
1139
323
    if (!fu_struct_efi_section_freeform_subtype_guid_parse_internal(st, error))
1140
0
        return NULL;
1141
323
    return g_steal_pointer(&st);
1142
323
}
1143
/* getters */
1144
/**
1145
 * fu_struct_efi_section_guid_defined_get_name: (skip):
1146
 **/
1147
const fwupd_guid_t *
1148
fu_struct_efi_section_guid_defined_get_name(const FuStructEfiSectionGuidDefined *st)
1149
7.10k
{
1150
7.10k
    g_return_val_if_fail(st != NULL, NULL);
1151
7.10k
    return (const fwupd_guid_t *) (st->data + 0);
1152
7.10k
}
1153
/**
1154
 * fu_struct_efi_section_guid_defined_get_offset: (skip):
1155
 **/
1156
guint16
1157
fu_struct_efi_section_guid_defined_get_offset(const FuStructEfiSectionGuidDefined *st)
1158
14.2k
{
1159
14.2k
    g_return_val_if_fail(st != NULL, 0x0);
1160
14.2k
    return fu_memread_uint16(st->data + 16, G_LITTLE_ENDIAN);
1161
14.2k
}
1162
/**
1163
 * fu_struct_efi_section_guid_defined_get_attr: (skip):
1164
 **/
1165
guint16
1166
fu_struct_efi_section_guid_defined_get_attr(const FuStructEfiSectionGuidDefined *st)
1167
0
{
1168
0
    g_return_val_if_fail(st != NULL, 0x0);
1169
0
    return fu_memread_uint16(st->data + 18, G_LITTLE_ENDIAN);
1170
0
}
1171
1172
/* setters */
1173
/**
1174
 * fu_struct_efi_section_guid_defined_set_name: (skip):
1175
 **/
1176
void
1177
fu_struct_efi_section_guid_defined_set_name(FuStructEfiSectionGuidDefined *st, const fwupd_guid_t *value)
1178
1.78k
{
1179
1.78k
    g_return_if_fail(st != NULL);
1180
1.78k
    g_return_if_fail(value != NULL);
1181
1.78k
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
1182
1.78k
}
1183
/**
1184
 * fu_struct_efi_section_guid_defined_set_offset: (skip):
1185
 **/
1186
void
1187
fu_struct_efi_section_guid_defined_set_offset(FuStructEfiSectionGuidDefined *st, guint16 value)
1188
1.78k
{
1189
1.78k
    g_return_if_fail(st != NULL);
1190
1.78k
    fu_memwrite_uint16(st->data + 16, value, G_LITTLE_ENDIAN);
1191
1.78k
}
1192
/**
1193
 * fu_struct_efi_section_guid_defined_set_attr: (skip):
1194
 **/
1195
void
1196
fu_struct_efi_section_guid_defined_set_attr(FuStructEfiSectionGuidDefined *st, guint16 value)
1197
0
{
1198
0
    g_return_if_fail(st != NULL);
1199
0
    fu_memwrite_uint16(st->data + 18, value, G_LITTLE_ENDIAN);
1200
0
}
1201
/**
1202
 * fu_struct_efi_section_guid_defined_new: (skip):
1203
 **/
1204
FuStructEfiSectionGuidDefined *
1205
fu_struct_efi_section_guid_defined_new(void)
1206
1.78k
{
1207
1.78k
    FuStructEfiSectionGuidDefined *st = g_byte_array_sized_new(20);
1208
1.78k
    fu_byte_array_set_size(st, 20, 0x0);
1209
1.78k
    return st;
1210
1.78k
}
1211
/**
1212
 * fu_struct_efi_section_guid_defined_to_string: (skip):
1213
 **/
1214
static gchar *
1215
fu_struct_efi_section_guid_defined_to_string(const FuStructEfiSectionGuidDefined *st)
1216
0
{
1217
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSectionGuidDefined:\n");
1218
0
    g_return_val_if_fail(st != NULL, NULL);
1219
0
    {
1220
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_section_guid_defined_get_name(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
1221
0
        g_string_append_printf(str, "  name: %s\n", tmp);
1222
0
    }
1223
0
    g_string_append_printf(str, "  offset: 0x%x\n",
1224
0
                           (guint) fu_struct_efi_section_guid_defined_get_offset(st));
1225
0
    g_string_append_printf(str, "  attr: 0x%x\n",
1226
0
                           (guint) fu_struct_efi_section_guid_defined_get_attr(st));
1227
0
    if (str->len > 0)
1228
0
        g_string_set_size(str, str->len - 1);
1229
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1230
0
}
1231
static gboolean
1232
fu_struct_efi_section_guid_defined_validate_internal(FuStructEfiSectionGuidDefined *st, GError **error)
1233
7.10k
{
1234
7.10k
    g_return_val_if_fail(st != NULL, FALSE);
1235
7.10k
    return TRUE;
1236
7.10k
}
1237
static gboolean
1238
fu_struct_efi_section_guid_defined_parse_internal(FuStructEfiSectionGuidDefined *st, GError **error)
1239
7.10k
{
1240
7.10k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1241
0
        g_autofree gchar *str = fu_struct_efi_section_guid_defined_to_string(st);
1242
0
        g_debug("%s", str);
1243
0
    }
1244
7.10k
    if (!fu_struct_efi_section_guid_defined_validate_internal(st, error))
1245
0
        return FALSE;
1246
7.10k
    return TRUE;
1247
7.10k
}
1248
/**
1249
 * fu_struct_efi_section_guid_defined_parse_stream: (skip):
1250
 **/
1251
FuStructEfiSectionGuidDefined *
1252
fu_struct_efi_section_guid_defined_parse_stream(GInputStream *stream, gsize offset, GError **error)
1253
7.12k
{
1254
7.12k
    g_autoptr(GByteArray) st = NULL;
1255
7.12k
    st = fu_input_stream_read_byte_array(stream, offset, 20, NULL, error);
1256
7.12k
    if (st == NULL) {
1257
1
        g_prefix_error(error, "FuStructEfiSectionGuidDefined failed read of 0x%x: ", (guint) 20);
1258
1
        return NULL;
1259
1
    }
1260
7.12k
    if (st->len != 20) {
1261
20
        g_set_error(error,
1262
20
                    FWUPD_ERROR,
1263
20
                    FWUPD_ERROR_INVALID_DATA,
1264
20
                    "FuStructEfiSectionGuidDefined requested 0x%x and got 0x%x",
1265
20
                    (guint) 20,
1266
20
                    (guint) st->len);
1267
20
        return NULL;
1268
20
    }
1269
7.10k
    if (!fu_struct_efi_section_guid_defined_parse_internal(st, error))
1270
0
        return NULL;
1271
7.10k
    return g_steal_pointer(&st);
1272
7.10k
}
1273
/* getters */
1274
/**
1275
 * fu_struct_efi_volume_get_zero_vector: (skip):
1276
 **/
1277
const fwupd_guid_t *
1278
fu_struct_efi_volume_get_zero_vector(const FuStructEfiVolume *st)
1279
0
{
1280
0
    g_return_val_if_fail(st != NULL, NULL);
1281
0
    return (const fwupd_guid_t *) (st->data + 0);
1282
0
}
1283
/**
1284
 * fu_struct_efi_volume_get_guid: (skip):
1285
 **/
1286
const fwupd_guid_t *
1287
fu_struct_efi_volume_get_guid(const FuStructEfiVolume *st)
1288
10.0k
{
1289
10.0k
    g_return_val_if_fail(st != NULL, NULL);
1290
10.0k
    return (const fwupd_guid_t *) (st->data + 16);
1291
10.0k
}
1292
/**
1293
 * fu_struct_efi_volume_get_length: (skip):
1294
 **/
1295
guint64
1296
fu_struct_efi_volume_get_length(const FuStructEfiVolume *st)
1297
10.0k
{
1298
10.0k
    g_return_val_if_fail(st != NULL, 0x0);
1299
10.0k
    return fu_memread_uint64(st->data + 32, G_LITTLE_ENDIAN);
1300
10.0k
}
1301
/**
1302
 * fu_struct_efi_volume_get_signature: (skip):
1303
 **/
1304
static guint32
1305
fu_struct_efi_volume_get_signature(const FuStructEfiVolume *st)
1306
11.1M
{
1307
11.1M
    g_return_val_if_fail(st != NULL, 0x0);
1308
11.1M
    return fu_memread_uint32(st->data + 40, G_LITTLE_ENDIAN);
1309
11.1M
}
1310
/**
1311
 * fu_struct_efi_volume_get_attrs: (skip):
1312
 **/
1313
guint32
1314
fu_struct_efi_volume_get_attrs(const FuStructEfiVolume *st)
1315
7.92k
{
1316
7.92k
    g_return_val_if_fail(st != NULL, 0x0);
1317
7.92k
    return fu_memread_uint32(st->data + 44, G_LITTLE_ENDIAN);
1318
7.92k
}
1319
/**
1320
 * fu_struct_efi_volume_get_hdr_len: (skip):
1321
 **/
1322
guint16
1323
fu_struct_efi_volume_get_hdr_len(const FuStructEfiVolume *st)
1324
7.86k
{
1325
7.86k
    g_return_val_if_fail(st != NULL, 0x0);
1326
7.86k
    return fu_memread_uint16(st->data + 48, G_LITTLE_ENDIAN);
1327
7.86k
}
1328
/**
1329
 * fu_struct_efi_volume_get_checksum: (skip):
1330
 **/
1331
guint16
1332
fu_struct_efi_volume_get_checksum(const FuStructEfiVolume *st)
1333
348
{
1334
348
    g_return_val_if_fail(st != NULL, 0x0);
1335
348
    return fu_memread_uint16(st->data + 50, G_LITTLE_ENDIAN);
1336
348
}
1337
/**
1338
 * fu_struct_efi_volume_get_ext_hdr: (skip):
1339
 **/
1340
guint16
1341
fu_struct_efi_volume_get_ext_hdr(const FuStructEfiVolume *st)
1342
7.54k
{
1343
7.54k
    g_return_val_if_fail(st != NULL, 0x0);
1344
7.54k
    return fu_memread_uint16(st->data + 52, G_LITTLE_ENDIAN);
1345
7.54k
}
1346
/**
1347
 * fu_struct_efi_volume_get_revision: (skip):
1348
 **/
1349
static guint8
1350
fu_struct_efi_volume_get_revision(const FuStructEfiVolume *st)
1351
20.8k
{
1352
20.8k
    g_return_val_if_fail(st != NULL, 0x0);
1353
20.8k
    return st->data[55];
1354
20.8k
}
1355
1356
/* setters */
1357
/**
1358
 * fu_struct_efi_volume_set_zero_vector: (skip):
1359
 **/
1360
void
1361
fu_struct_efi_volume_set_zero_vector(FuStructEfiVolume *st, const fwupd_guid_t *value)
1362
0
{
1363
0
    g_return_if_fail(st != NULL);
1364
0
    g_return_if_fail(value != NULL);
1365
0
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
1366
0
}
1367
/**
1368
 * fu_struct_efi_volume_set_guid: (skip):
1369
 **/
1370
void
1371
fu_struct_efi_volume_set_guid(FuStructEfiVolume *st, const fwupd_guid_t *value)
1372
3.00k
{
1373
3.00k
    g_return_if_fail(st != NULL);
1374
3.00k
    g_return_if_fail(value != NULL);
1375
3.00k
    memcpy(st->data + 16, value, sizeof(*value)); /* nocheck:blocked */
1376
3.00k
}
1377
/**
1378
 * fu_struct_efi_volume_set_length: (skip):
1379
 **/
1380
void
1381
fu_struct_efi_volume_set_length(FuStructEfiVolume *st, guint64 value)
1382
3.00k
{
1383
3.00k
    g_return_if_fail(st != NULL);
1384
3.00k
    fu_memwrite_uint64(st->data + 32, value, G_LITTLE_ENDIAN);
1385
3.00k
}
1386
/**
1387
 * fu_struct_efi_volume_set_signature: (skip):
1388
 **/
1389
static void
1390
fu_struct_efi_volume_set_signature(FuStructEfiVolume *st, guint32 value)
1391
3.22k
{
1392
3.22k
    g_return_if_fail(st != NULL);
1393
3.22k
    fu_memwrite_uint32(st->data + 40, value, G_LITTLE_ENDIAN);
1394
3.22k
}
1395
/**
1396
 * fu_struct_efi_volume_set_attrs: (skip):
1397
 **/
1398
void
1399
fu_struct_efi_volume_set_attrs(FuStructEfiVolume *st, guint32 value)
1400
3.00k
{
1401
3.00k
    g_return_if_fail(st != NULL);
1402
3.00k
    fu_memwrite_uint32(st->data + 44, value, G_LITTLE_ENDIAN);
1403
3.00k
}
1404
/**
1405
 * fu_struct_efi_volume_set_hdr_len: (skip):
1406
 **/
1407
void
1408
fu_struct_efi_volume_set_hdr_len(FuStructEfiVolume *st, guint16 value)
1409
3.00k
{
1410
3.00k
    g_return_if_fail(st != NULL);
1411
3.00k
    fu_memwrite_uint16(st->data + 48, value, G_LITTLE_ENDIAN);
1412
3.00k
}
1413
/**
1414
 * fu_struct_efi_volume_set_checksum: (skip):
1415
 **/
1416
void
1417
fu_struct_efi_volume_set_checksum(FuStructEfiVolume *st, guint16 value)
1418
3.00k
{
1419
3.00k
    g_return_if_fail(st != NULL);
1420
3.00k
    fu_memwrite_uint16(st->data + 50, value, G_LITTLE_ENDIAN);
1421
3.00k
}
1422
/**
1423
 * fu_struct_efi_volume_set_ext_hdr: (skip):
1424
 **/
1425
void
1426
fu_struct_efi_volume_set_ext_hdr(FuStructEfiVolume *st, guint16 value)
1427
0
{
1428
0
    g_return_if_fail(st != NULL);
1429
0
    fu_memwrite_uint16(st->data + 52, value, G_LITTLE_ENDIAN);
1430
0
}
1431
/**
1432
 * fu_struct_efi_volume_set_revision: (skip):
1433
 **/
1434
static void
1435
fu_struct_efi_volume_set_revision(FuStructEfiVolume *st, guint8 value)
1436
3.22k
{
1437
3.22k
    g_return_if_fail(st != NULL);
1438
3.22k
    st->data[55] = value;
1439
3.22k
}
1440
/**
1441
 * fu_struct_efi_volume_new: (skip):
1442
 **/
1443
FuStructEfiVolume *
1444
fu_struct_efi_volume_new(void)
1445
3.22k
{
1446
3.22k
    FuStructEfiVolume *st = g_byte_array_sized_new(56);
1447
3.22k
    fu_byte_array_set_size(st, 56, 0x0);
1448
3.22k
    fu_struct_efi_volume_set_signature(st, 0x4856465F);
1449
3.22k
    fu_struct_efi_volume_set_revision(st, 0x02);
1450
3.22k
    return st;
1451
3.22k
}
1452
/**
1453
 * fu_struct_efi_volume_to_string: (skip):
1454
 **/
1455
static gchar *
1456
fu_struct_efi_volume_to_string(const FuStructEfiVolume *st)
1457
0
{
1458
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVolume:\n");
1459
0
    g_return_val_if_fail(st != NULL, NULL);
1460
0
    {
1461
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_volume_get_zero_vector(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
1462
0
        g_string_append_printf(str, "  zero_vector: %s\n", tmp);
1463
0
    }
1464
0
    {
1465
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_volume_get_guid(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
1466
0
        g_string_append_printf(str, "  guid: %s\n", tmp);
1467
0
    }
1468
0
    g_string_append_printf(str, "  length: 0x%x\n",
1469
0
                           (guint) fu_struct_efi_volume_get_length(st));
1470
0
    g_string_append_printf(str, "  attrs: 0x%x\n",
1471
0
                           (guint) fu_struct_efi_volume_get_attrs(st));
1472
0
    g_string_append_printf(str, "  hdr_len: 0x%x\n",
1473
0
                           (guint) fu_struct_efi_volume_get_hdr_len(st));
1474
0
    g_string_append_printf(str, "  checksum: 0x%x\n",
1475
0
                           (guint) fu_struct_efi_volume_get_checksum(st));
1476
0
    g_string_append_printf(str, "  ext_hdr: 0x%x\n",
1477
0
                           (guint) fu_struct_efi_volume_get_ext_hdr(st));
1478
0
    if (str->len > 0)
1479
0
        g_string_set_size(str, str->len - 1);
1480
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1481
0
}
1482
static gboolean
1483
fu_struct_efi_volume_validate_internal(FuStructEfiVolume *st, GError **error)
1484
5.60M
{
1485
5.60M
    g_return_val_if_fail(st != NULL, FALSE);
1486
5.60M
    if (fu_struct_efi_volume_get_signature(st) != 0x4856465F) {
1487
5.57M
        g_set_error(error,
1488
5.57M
                    FWUPD_ERROR,
1489
5.57M
                    FWUPD_ERROR_INVALID_DATA,
1490
5.57M
                    "constant FuStructEfiVolume.signature was not valid, "
1491
5.57M
                    "expected 0x%x and got 0x%x",
1492
5.57M
                    (guint) 0x4856465F,
1493
5.57M
                    (guint) fu_struct_efi_volume_get_signature(st));
1494
5.57M
        return FALSE;
1495
5.57M
    }
1496
20.8k
    if (fu_struct_efi_volume_get_revision(st) != 0x02) {
1497
693
        g_set_error_literal(error,
1498
693
                            FWUPD_ERROR,
1499
693
                            FWUPD_ERROR_INVALID_DATA,
1500
693
                            "constant FuStructEfiVolume.revision was not valid");
1501
693
        return FALSE;
1502
693
    }
1503
20.1k
    return TRUE;
1504
20.8k
}
1505
/**
1506
 * fu_struct_efi_volume_validate_stream: (skip):
1507
 **/
1508
gboolean
1509
fu_struct_efi_volume_validate_stream(GInputStream *stream, gsize offset, GError **error)
1510
5.59M
{
1511
5.59M
    g_autoptr(GByteArray) st = NULL;
1512
5.59M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
1513
5.59M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
1514
5.59M
    st = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
1515
5.59M
    if (st == NULL) {
1516
2
        g_prefix_error(error, "FuStructEfiVolume failed read of 0x%x: ", (guint) 56);
1517
2
        return FALSE;
1518
2
    }
1519
5.59M
    if (st->len != 56) {
1520
7.03k
        g_set_error(error,
1521
7.03k
                    FWUPD_ERROR,
1522
7.03k
                    FWUPD_ERROR_INVALID_DATA,
1523
7.03k
                    "FuStructEfiVolume requested 0x%x and got 0x%x",
1524
7.03k
                    (guint) 56,
1525
7.03k
                    (guint) st->len);
1526
7.03k
        return FALSE;
1527
7.03k
    }
1528
5.59M
    return fu_struct_efi_volume_validate_internal(st, error);
1529
5.59M
}
1530
static gboolean
1531
fu_struct_efi_volume_parse_internal(FuStructEfiVolume *st, GError **error)
1532
10.0k
{
1533
10.0k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1534
0
        g_autofree gchar *str = fu_struct_efi_volume_to_string(st);
1535
0
        g_debug("%s", str);
1536
0
    }
1537
10.0k
    if (!fu_struct_efi_volume_validate_internal(st, error))
1538
0
        return FALSE;
1539
10.0k
    return TRUE;
1540
10.0k
}
1541
/**
1542
 * fu_struct_efi_volume_parse_stream: (skip):
1543
 **/
1544
FuStructEfiVolume *
1545
fu_struct_efi_volume_parse_stream(GInputStream *stream, gsize offset, GError **error)
1546
10.0k
{
1547
10.0k
    g_autoptr(GByteArray) st = NULL;
1548
10.0k
    st = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
1549
10.0k
    if (st == NULL) {
1550
0
        g_prefix_error(error, "FuStructEfiVolume failed read of 0x%x: ", (guint) 56);
1551
0
        return NULL;
1552
0
    }
1553
10.0k
    if (st->len != 56) {
1554
0
        g_set_error(error,
1555
0
                    FWUPD_ERROR,
1556
0
                    FWUPD_ERROR_INVALID_DATA,
1557
0
                    "FuStructEfiVolume requested 0x%x and got 0x%x",
1558
0
                    (guint) 56,
1559
0
                    (guint) st->len);
1560
0
        return NULL;
1561
0
    }
1562
10.0k
    if (!fu_struct_efi_volume_parse_internal(st, error))
1563
0
        return NULL;
1564
10.0k
    return g_steal_pointer(&st);
1565
10.0k
}
1566
/* getters */
1567
/**
1568
 * fu_struct_efi_volume_ext_header_get_fv_name: (skip):
1569
 **/
1570
const fwupd_guid_t *
1571
fu_struct_efi_volume_ext_header_get_fv_name(const FuStructEfiVolumeExtHeader *st)
1572
0
{
1573
0
    g_return_val_if_fail(st != NULL, NULL);
1574
0
    return (const fwupd_guid_t *) (st->data + 0);
1575
0
}
1576
/**
1577
 * fu_struct_efi_volume_ext_header_get_size: (skip):
1578
 **/
1579
guint32
1580
fu_struct_efi_volume_ext_header_get_size(const FuStructEfiVolumeExtHeader *st)
1581
215
{
1582
215
    g_return_val_if_fail(st != NULL, 0x0);
1583
215
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
1584
215
}
1585
1586
/* setters */
1587
/**
1588
 * fu_struct_efi_volume_ext_header_to_string: (skip):
1589
 **/
1590
static gchar *
1591
fu_struct_efi_volume_ext_header_to_string(const FuStructEfiVolumeExtHeader *st)
1592
0
{
1593
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVolumeExtHeader:\n");
1594
0
    g_return_val_if_fail(st != NULL, NULL);
1595
0
    {
1596
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_volume_ext_header_get_fv_name(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
1597
0
        g_string_append_printf(str, "  fv_name: %s\n", tmp);
1598
0
    }
1599
0
    g_string_append_printf(str, "  size: 0x%x\n",
1600
0
                           (guint) fu_struct_efi_volume_ext_header_get_size(st));
1601
0
    if (str->len > 0)
1602
0
        g_string_set_size(str, str->len - 1);
1603
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1604
0
}
1605
static gboolean
1606
fu_struct_efi_volume_ext_header_validate_internal(FuStructEfiVolumeExtHeader *st, GError **error)
1607
215
{
1608
215
    g_return_val_if_fail(st != NULL, FALSE);
1609
215
    return TRUE;
1610
215
}
1611
static gboolean
1612
fu_struct_efi_volume_ext_header_parse_internal(FuStructEfiVolumeExtHeader *st, GError **error)
1613
215
{
1614
215
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1615
0
        g_autofree gchar *str = fu_struct_efi_volume_ext_header_to_string(st);
1616
0
        g_debug("%s", str);
1617
0
    }
1618
215
    if (!fu_struct_efi_volume_ext_header_validate_internal(st, error))
1619
0
        return FALSE;
1620
215
    return TRUE;
1621
215
}
1622
/**
1623
 * fu_struct_efi_volume_ext_header_parse_stream: (skip):
1624
 **/
1625
FuStructEfiVolumeExtHeader *
1626
fu_struct_efi_volume_ext_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
1627
260
{
1628
260
    g_autoptr(GByteArray) st = NULL;
1629
260
    st = fu_input_stream_read_byte_array(stream, offset, 20, NULL, error);
1630
260
    if (st == NULL) {
1631
40
        g_prefix_error(error, "FuStructEfiVolumeExtHeader failed read of 0x%x: ", (guint) 20);
1632
40
        return NULL;
1633
40
    }
1634
220
    if (st->len != 20) {
1635
5
        g_set_error(error,
1636
5
                    FWUPD_ERROR,
1637
5
                    FWUPD_ERROR_INVALID_DATA,
1638
5
                    "FuStructEfiVolumeExtHeader requested 0x%x and got 0x%x",
1639
5
                    (guint) 20,
1640
5
                    (guint) st->len);
1641
5
        return NULL;
1642
5
    }
1643
215
    if (!fu_struct_efi_volume_ext_header_parse_internal(st, error))
1644
0
        return NULL;
1645
215
    return g_steal_pointer(&st);
1646
215
}
1647
/* getters */
1648
/**
1649
 * fu_struct_efi_volume_ext_entry_get_size: (skip):
1650
 **/
1651
guint16
1652
fu_struct_efi_volume_ext_entry_get_size(const FuStructEfiVolumeExtEntry *st)
1653
4.49k
{
1654
4.49k
    g_return_val_if_fail(st != NULL, 0x0);
1655
4.49k
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
1656
4.49k
}
1657
/**
1658
 * fu_struct_efi_volume_ext_entry_get_type: (skip):
1659
 **/
1660
FuEfiVolumeExtEntryType
1661
fu_struct_efi_volume_ext_entry_get_type(const FuStructEfiVolumeExtEntry *st)
1662
0
{
1663
0
    g_return_val_if_fail(st != NULL, 0x0);
1664
0
    return fu_memread_uint16(st->data + 2, G_LITTLE_ENDIAN);
1665
0
}
1666
1667
/* setters */
1668
/**
1669
 * fu_struct_efi_volume_ext_entry_to_string: (skip):
1670
 **/
1671
static gchar *
1672
fu_struct_efi_volume_ext_entry_to_string(const FuStructEfiVolumeExtEntry *st)
1673
0
{
1674
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVolumeExtEntry:\n");
1675
0
    g_return_val_if_fail(st != NULL, NULL);
1676
0
    g_string_append_printf(str, "  size: 0x%x\n",
1677
0
                           (guint) fu_struct_efi_volume_ext_entry_get_size(st));
1678
0
    {
1679
0
        const gchar *tmp = fu_efi_volume_ext_entry_type_to_string(fu_struct_efi_volume_ext_entry_get_type(st));
1680
0
        if (tmp != NULL) {
1681
0
            g_string_append_printf(str, "  type: 0x%x [%s]\n", (guint) fu_struct_efi_volume_ext_entry_get_type(st), tmp);
1682
0
        } else {
1683
0
            g_string_append_printf(str, "  type: 0x%x\n", (guint) fu_struct_efi_volume_ext_entry_get_type(st));
1684
0
        }
1685
0
    }
1686
0
    if (str->len > 0)
1687
0
        g_string_set_size(str, str->len - 1);
1688
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1689
0
}
1690
static gboolean
1691
fu_struct_efi_volume_ext_entry_validate_internal(FuStructEfiVolumeExtEntry *st, GError **error)
1692
1.50k
{
1693
1.50k
    g_return_val_if_fail(st != NULL, FALSE);
1694
1.50k
    return TRUE;
1695
1.50k
}
1696
static gboolean
1697
fu_struct_efi_volume_ext_entry_parse_internal(FuStructEfiVolumeExtEntry *st, GError **error)
1698
1.50k
{
1699
1.50k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1700
0
        g_autofree gchar *str = fu_struct_efi_volume_ext_entry_to_string(st);
1701
0
        g_debug("%s", str);
1702
0
    }
1703
1.50k
    if (!fu_struct_efi_volume_ext_entry_validate_internal(st, error))
1704
0
        return FALSE;
1705
1.50k
    return TRUE;
1706
1.50k
}
1707
/**
1708
 * fu_struct_efi_volume_ext_entry_parse_stream: (skip):
1709
 **/
1710
FuStructEfiVolumeExtEntry *
1711
fu_struct_efi_volume_ext_entry_parse_stream(GInputStream *stream, gsize offset, GError **error)
1712
1.58k
{
1713
1.58k
    g_autoptr(GByteArray) st = NULL;
1714
1.58k
    st = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
1715
1.58k
    if (st == NULL) {
1716
68
        g_prefix_error(error, "FuStructEfiVolumeExtEntry failed read of 0x%x: ", (guint) 4);
1717
68
        return NULL;
1718
68
    }
1719
1.51k
    if (st->len != 4) {
1720
10
        g_set_error(error,
1721
10
                    FWUPD_ERROR,
1722
10
                    FWUPD_ERROR_INVALID_DATA,
1723
10
                    "FuStructEfiVolumeExtEntry requested 0x%x and got 0x%x",
1724
10
                    (guint) 4,
1725
10
                    (guint) st->len);
1726
10
        return NULL;
1727
10
    }
1728
1.50k
    if (!fu_struct_efi_volume_ext_entry_parse_internal(st, error))
1729
0
        return NULL;
1730
1.50k
    return g_steal_pointer(&st);
1731
1.50k
}
1732
/* getters */
1733
/**
1734
 * fu_struct_efi_volume_block_map_get_num_blocks: (skip):
1735
 **/
1736
guint32
1737
fu_struct_efi_volume_block_map_get_num_blocks(const FuStructEfiVolumeBlockMap *st)
1738
358k
{
1739
358k
    g_return_val_if_fail(st != NULL, 0x0);
1740
358k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
1741
358k
}
1742
/**
1743
 * fu_struct_efi_volume_block_map_get_length: (skip):
1744
 **/
1745
guint32
1746
fu_struct_efi_volume_block_map_get_length(const FuStructEfiVolumeBlockMap *st)
1747
358k
{
1748
358k
    g_return_val_if_fail(st != NULL, 0x0);
1749
358k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
1750
358k
}
1751
1752
/* setters */
1753
/**
1754
 * fu_struct_efi_volume_block_map_set_num_blocks: (skip):
1755
 **/
1756
void
1757
fu_struct_efi_volume_block_map_set_num_blocks(FuStructEfiVolumeBlockMap *st, guint32 value)
1758
6.01k
{
1759
6.01k
    g_return_if_fail(st != NULL);
1760
6.01k
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
1761
6.01k
}
1762
/**
1763
 * fu_struct_efi_volume_block_map_set_length: (skip):
1764
 **/
1765
void
1766
fu_struct_efi_volume_block_map_set_length(FuStructEfiVolumeBlockMap *st, guint32 value)
1767
6.01k
{
1768
6.01k
    g_return_if_fail(st != NULL);
1769
6.01k
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
1770
6.01k
}
1771
/**
1772
 * fu_struct_efi_volume_block_map_new: (skip):
1773
 **/
1774
FuStructEfiVolumeBlockMap *
1775
fu_struct_efi_volume_block_map_new(void)
1776
3.22k
{
1777
3.22k
    FuStructEfiVolumeBlockMap *st = g_byte_array_sized_new(8);
1778
3.22k
    fu_byte_array_set_size(st, 8, 0x0);
1779
3.22k
    return st;
1780
3.22k
}
1781
/**
1782
 * fu_struct_efi_volume_block_map_to_string: (skip):
1783
 **/
1784
static gchar *
1785
fu_struct_efi_volume_block_map_to_string(const FuStructEfiVolumeBlockMap *st)
1786
0
{
1787
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVolumeBlockMap:\n");
1788
0
    g_return_val_if_fail(st != NULL, NULL);
1789
0
    g_string_append_printf(str, "  num_blocks: 0x%x\n",
1790
0
                           (guint) fu_struct_efi_volume_block_map_get_num_blocks(st));
1791
0
    g_string_append_printf(str, "  length: 0x%x\n",
1792
0
                           (guint) fu_struct_efi_volume_block_map_get_length(st));
1793
0
    if (str->len > 0)
1794
0
        g_string_set_size(str, str->len - 1);
1795
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1796
0
}
1797
static gboolean
1798
fu_struct_efi_volume_block_map_validate_internal(FuStructEfiVolumeBlockMap *st, GError **error)
1799
358k
{
1800
358k
    g_return_val_if_fail(st != NULL, FALSE);
1801
358k
    return TRUE;
1802
358k
}
1803
static gboolean
1804
fu_struct_efi_volume_block_map_parse_internal(FuStructEfiVolumeBlockMap *st, GError **error)
1805
358k
{
1806
358k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1807
0
        g_autofree gchar *str = fu_struct_efi_volume_block_map_to_string(st);
1808
0
        g_debug("%s", str);
1809
0
    }
1810
358k
    if (!fu_struct_efi_volume_block_map_validate_internal(st, error))
1811
0
        return FALSE;
1812
358k
    return TRUE;
1813
358k
}
1814
/**
1815
 * fu_struct_efi_volume_block_map_parse_stream: (skip):
1816
 **/
1817
FuStructEfiVolumeBlockMap *
1818
fu_struct_efi_volume_block_map_parse_stream(GInputStream *stream, gsize offset, GError **error)
1819
358k
{
1820
358k
    g_autoptr(GByteArray) st = NULL;
1821
358k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1822
358k
    if (st == NULL) {
1823
0
        g_prefix_error(error, "FuStructEfiVolumeBlockMap failed read of 0x%x: ", (guint) 8);
1824
0
        return NULL;
1825
0
    }
1826
358k
    if (st->len != 8) {
1827
301
        g_set_error(error,
1828
301
                    FWUPD_ERROR,
1829
301
                    FWUPD_ERROR_INVALID_DATA,
1830
301
                    "FuStructEfiVolumeBlockMap requested 0x%x and got 0x%x",
1831
301
                    (guint) 8,
1832
301
                    (guint) st->len);
1833
301
        return NULL;
1834
301
    }
1835
358k
    if (!fu_struct_efi_volume_block_map_parse_internal(st, error))
1836
0
        return NULL;
1837
358k
    return g_steal_pointer(&st);
1838
358k
}
1839
/* getters */
1840
/**
1841
 * fu_struct_efi_time_get_year: (skip):
1842
 **/
1843
guint16
1844
fu_struct_efi_time_get_year(const FuStructEfiTime *st)
1845
0
{
1846
0
    g_return_val_if_fail(st != NULL, 0x0);
1847
0
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
1848
0
}
1849
/**
1850
 * fu_struct_efi_time_get_month: (skip):
1851
 **/
1852
guint8
1853
fu_struct_efi_time_get_month(const FuStructEfiTime *st)
1854
0
{
1855
0
    g_return_val_if_fail(st != NULL, 0x0);
1856
0
    return st->data[2];
1857
0
}
1858
/**
1859
 * fu_struct_efi_time_get_day: (skip):
1860
 **/
1861
guint8
1862
fu_struct_efi_time_get_day(const FuStructEfiTime *st)
1863
0
{
1864
0
    g_return_val_if_fail(st != NULL, 0x0);
1865
0
    return st->data[3];
1866
0
}
1867
/**
1868
 * fu_struct_efi_time_get_hour: (skip):
1869
 **/
1870
guint8
1871
fu_struct_efi_time_get_hour(const FuStructEfiTime *st)
1872
0
{
1873
0
    g_return_val_if_fail(st != NULL, 0x0);
1874
0
    return st->data[4];
1875
0
}
1876
/**
1877
 * fu_struct_efi_time_get_minute: (skip):
1878
 **/
1879
guint8
1880
fu_struct_efi_time_get_minute(const FuStructEfiTime *st)
1881
0
{
1882
0
    g_return_val_if_fail(st != NULL, 0x0);
1883
0
    return st->data[5];
1884
0
}
1885
/**
1886
 * fu_struct_efi_time_get_second: (skip):
1887
 **/
1888
guint8
1889
fu_struct_efi_time_get_second(const FuStructEfiTime *st)
1890
0
{
1891
0
    g_return_val_if_fail(st != NULL, 0x0);
1892
0
    return st->data[6];
1893
0
}
1894
/**
1895
 * fu_struct_efi_time_get_nanosecond: (skip):
1896
 **/
1897
guint32
1898
fu_struct_efi_time_get_nanosecond(const FuStructEfiTime *st)
1899
0
{
1900
0
    g_return_val_if_fail(st != NULL, 0x0);
1901
0
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
1902
0
}
1903
/**
1904
 * fu_struct_efi_time_get_timezone: (skip):
1905
 **/
1906
guint16
1907
fu_struct_efi_time_get_timezone(const FuStructEfiTime *st)
1908
0
{
1909
0
    g_return_val_if_fail(st != NULL, 0x0);
1910
0
    return fu_memread_uint16(st->data + 12, G_LITTLE_ENDIAN);
1911
0
}
1912
/**
1913
 * fu_struct_efi_time_get_daylight: (skip):
1914
 **/
1915
guint8
1916
fu_struct_efi_time_get_daylight(const FuStructEfiTime *st)
1917
0
{
1918
0
    g_return_val_if_fail(st != NULL, 0x0);
1919
0
    return st->data[14];
1920
0
}
1921
1922
/* setters */
1923
/**
1924
 * fu_struct_efi_time_set_year: (skip):
1925
 **/
1926
void
1927
fu_struct_efi_time_set_year(FuStructEfiTime *st, guint16 value)
1928
0
{
1929
0
    g_return_if_fail(st != NULL);
1930
0
    fu_memwrite_uint16(st->data + 0, value, G_LITTLE_ENDIAN);
1931
0
}
1932
/**
1933
 * fu_struct_efi_time_set_month: (skip):
1934
 **/
1935
void
1936
fu_struct_efi_time_set_month(FuStructEfiTime *st, guint8 value)
1937
0
{
1938
0
    g_return_if_fail(st != NULL);
1939
0
    st->data[2] = value;
1940
0
}
1941
/**
1942
 * fu_struct_efi_time_set_day: (skip):
1943
 **/
1944
void
1945
fu_struct_efi_time_set_day(FuStructEfiTime *st, guint8 value)
1946
0
{
1947
0
    g_return_if_fail(st != NULL);
1948
0
    st->data[3] = value;
1949
0
}
1950
/**
1951
 * fu_struct_efi_time_set_hour: (skip):
1952
 **/
1953
void
1954
fu_struct_efi_time_set_hour(FuStructEfiTime *st, guint8 value)
1955
0
{
1956
0
    g_return_if_fail(st != NULL);
1957
0
    st->data[4] = value;
1958
0
}
1959
/**
1960
 * fu_struct_efi_time_set_minute: (skip):
1961
 **/
1962
void
1963
fu_struct_efi_time_set_minute(FuStructEfiTime *st, guint8 value)
1964
0
{
1965
0
    g_return_if_fail(st != NULL);
1966
0
    st->data[5] = value;
1967
0
}
1968
/**
1969
 * fu_struct_efi_time_set_second: (skip):
1970
 **/
1971
void
1972
fu_struct_efi_time_set_second(FuStructEfiTime *st, guint8 value)
1973
0
{
1974
0
    g_return_if_fail(st != NULL);
1975
0
    st->data[6] = value;
1976
0
}
1977
/**
1978
 * fu_struct_efi_time_set_nanosecond: (skip):
1979
 **/
1980
void
1981
fu_struct_efi_time_set_nanosecond(FuStructEfiTime *st, guint32 value)
1982
0
{
1983
0
    g_return_if_fail(st != NULL);
1984
0
    fu_memwrite_uint32(st->data + 8, value, G_LITTLE_ENDIAN);
1985
0
}
1986
/**
1987
 * fu_struct_efi_time_set_timezone: (skip):
1988
 **/
1989
void
1990
fu_struct_efi_time_set_timezone(FuStructEfiTime *st, guint16 value)
1991
0
{
1992
0
    g_return_if_fail(st != NULL);
1993
0
    fu_memwrite_uint16(st->data + 12, value, G_LITTLE_ENDIAN);
1994
0
}
1995
/**
1996
 * fu_struct_efi_time_set_daylight: (skip):
1997
 **/
1998
void
1999
fu_struct_efi_time_set_daylight(FuStructEfiTime *st, guint8 value)
2000
0
{
2001
0
    g_return_if_fail(st != NULL);
2002
0
    st->data[14] = value;
2003
0
}
2004
/**
2005
 * fu_struct_efi_time_new: (skip):
2006
 **/
2007
FuStructEfiTime *
2008
fu_struct_efi_time_new(void)
2009
312
{
2010
312
    FuStructEfiTime *st = g_byte_array_sized_new(16);
2011
312
    fu_byte_array_set_size(st, 16, 0x0);
2012
312
    return st;
2013
312
}
2014
/**
2015
 * fu_struct_efi_time_to_string: (skip):
2016
 **/
2017
static gchar *
2018
fu_struct_efi_time_to_string(const FuStructEfiTime *st)
2019
0
{
2020
0
    g_autoptr(GString) str = g_string_new("FuStructEfiTime:\n");
2021
0
    g_return_val_if_fail(st != NULL, NULL);
2022
0
    g_string_append_printf(str, "  year: 0x%x\n",
2023
0
                           (guint) fu_struct_efi_time_get_year(st));
2024
0
    g_string_append_printf(str, "  month: 0x%x\n",
2025
0
                           (guint) fu_struct_efi_time_get_month(st));
2026
0
    g_string_append_printf(str, "  day: 0x%x\n",
2027
0
                           (guint) fu_struct_efi_time_get_day(st));
2028
0
    g_string_append_printf(str, "  hour: 0x%x\n",
2029
0
                           (guint) fu_struct_efi_time_get_hour(st));
2030
0
    g_string_append_printf(str, "  minute: 0x%x\n",
2031
0
                           (guint) fu_struct_efi_time_get_minute(st));
2032
0
    g_string_append_printf(str, "  second: 0x%x\n",
2033
0
                           (guint) fu_struct_efi_time_get_second(st));
2034
0
    g_string_append_printf(str, "  nanosecond: 0x%x\n",
2035
0
                           (guint) fu_struct_efi_time_get_nanosecond(st));
2036
0
    g_string_append_printf(str, "  timezone: 0x%x\n",
2037
0
                           (guint) fu_struct_efi_time_get_timezone(st));
2038
0
    g_string_append_printf(str, "  daylight: 0x%x\n",
2039
0
                           (guint) fu_struct_efi_time_get_daylight(st));
2040
0
    if (str->len > 0)
2041
0
        g_string_set_size(str, str->len - 1);
2042
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2043
0
}
2044
static gboolean
2045
fu_struct_efi_time_validate_internal(FuStructEfiTime *st, GError **error)
2046
2.38k
{
2047
2.38k
    g_return_val_if_fail(st != NULL, FALSE);
2048
2.38k
    return TRUE;
2049
2.38k
}
2050
/* getters */
2051
/**
2052
 * fu_struct_efi_win_certificate_get_length: (skip):
2053
 **/
2054
guint32
2055
fu_struct_efi_win_certificate_get_length(const FuStructEfiWinCertificate *st)
2056
0
{
2057
0
    g_return_val_if_fail(st != NULL, 0x0);
2058
0
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
2059
0
}
2060
/**
2061
 * fu_struct_efi_win_certificate_get_revision: (skip):
2062
 **/
2063
static guint16
2064
fu_struct_efi_win_certificate_get_revision(const FuStructEfiWinCertificate *st)
2065
0
{
2066
0
    g_return_val_if_fail(st != NULL, 0x0);
2067
0
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
2068
0
}
2069
/**
2070
 * fu_struct_efi_win_certificate_get_certificate_type: (skip):
2071
 **/
2072
static guint16
2073
fu_struct_efi_win_certificate_get_certificate_type(const FuStructEfiWinCertificate *st)
2074
0
{
2075
0
    g_return_val_if_fail(st != NULL, 0x0);
2076
0
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
2077
0
}
2078
/**
2079
 * fu_struct_efi_win_certificate_get_guid: (skip):
2080
 **/
2081
static const fwupd_guid_t *
2082
fu_struct_efi_win_certificate_get_guid(const FuStructEfiWinCertificate *st)
2083
0
{
2084
0
    g_return_val_if_fail(st != NULL, NULL);
2085
0
    return (const fwupd_guid_t *) (st->data + 8);
2086
0
}
2087
2088
/* setters */
2089
/**
2090
 * fu_struct_efi_win_certificate_set_length: (skip):
2091
 **/
2092
void
2093
fu_struct_efi_win_certificate_set_length(FuStructEfiWinCertificate *st, guint32 value)
2094
0
{
2095
0
    g_return_if_fail(st != NULL);
2096
0
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
2097
0
}
2098
/**
2099
 * fu_struct_efi_win_certificate_set_revision: (skip):
2100
 **/
2101
static void
2102
fu_struct_efi_win_certificate_set_revision(FuStructEfiWinCertificate *st, guint16 value)
2103
0
{
2104
0
    g_return_if_fail(st != NULL);
2105
0
    fu_memwrite_uint16(st->data + 4, value, G_LITTLE_ENDIAN);
2106
0
}
2107
/**
2108
 * fu_struct_efi_win_certificate_set_certificate_type: (skip):
2109
 **/
2110
static void
2111
fu_struct_efi_win_certificate_set_certificate_type(FuStructEfiWinCertificate *st, guint16 value)
2112
0
{
2113
0
    g_return_if_fail(st != NULL);
2114
0
    fu_memwrite_uint16(st->data + 6, value, G_LITTLE_ENDIAN);
2115
0
}
2116
/**
2117
 * fu_struct_efi_win_certificate_set_guid: (skip):
2118
 **/
2119
static void
2120
fu_struct_efi_win_certificate_set_guid(FuStructEfiWinCertificate *st, const fwupd_guid_t *value)
2121
0
{
2122
0
    g_return_if_fail(st != NULL);
2123
0
    g_return_if_fail(value != NULL);
2124
0
    memcpy(st->data + 8, value, sizeof(*value)); /* nocheck:blocked */
2125
0
}
2126
/**
2127
 * fu_struct_efi_win_certificate_new: (skip):
2128
 **/
2129
static FuStructEfiWinCertificate *
2130
fu_struct_efi_win_certificate_new(void)
2131
0
{
2132
0
    FuStructEfiWinCertificate *st = g_byte_array_sized_new(24);
2133
0
    fu_byte_array_set_size(st, 24, 0x0);
2134
0
    fu_struct_efi_win_certificate_set_length(st, 24);
2135
0
    fu_struct_efi_win_certificate_set_revision(st, 0x0200);
2136
0
    fu_struct_efi_win_certificate_set_certificate_type(st, 0x0EF1);
2137
0
    fu_struct_efi_win_certificate_set_guid(st, (fwupd_guid_t *) "\x9d\xd2\xaf\x4a\xdf\x68\xee\x49\x8a\xa9\x34\x7d\x37\x56\x65\xa7");
2138
0
    return st;
2139
0
}
2140
/**
2141
 * fu_struct_efi_win_certificate_to_string: (skip):
2142
 **/
2143
static gchar *
2144
fu_struct_efi_win_certificate_to_string(const FuStructEfiWinCertificate *st)
2145
0
{
2146
0
    g_autoptr(GString) str = g_string_new("FuStructEfiWinCertificate:\n");
2147
0
    g_return_val_if_fail(st != NULL, NULL);
2148
0
    g_string_append_printf(str, "  length: 0x%x\n",
2149
0
                           (guint) fu_struct_efi_win_certificate_get_length(st));
2150
0
    if (str->len > 0)
2151
0
        g_string_set_size(str, str->len - 1);
2152
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2153
0
}
2154
static gboolean
2155
fu_struct_efi_win_certificate_validate_internal(FuStructEfiWinCertificate *st, GError **error)
2156
0
{
2157
0
    g_return_val_if_fail(st != NULL, FALSE);
2158
0
    if (fu_struct_efi_win_certificate_get_revision(st) != 0x0200) {
2159
0
        g_set_error(error,
2160
0
                    FWUPD_ERROR,
2161
0
                    FWUPD_ERROR_INVALID_DATA,
2162
0
                    "constant FuStructEfiWinCertificate.revision was not valid, "
2163
0
                    "expected 0x%x and got 0x%x",
2164
0
                    (guint) 0x0200,
2165
0
                    (guint) fu_struct_efi_win_certificate_get_revision(st));
2166
0
        return FALSE;
2167
0
    }
2168
0
    if (fu_struct_efi_win_certificate_get_certificate_type(st) != 0x0EF1) {
2169
0
        g_set_error(error,
2170
0
                    FWUPD_ERROR,
2171
0
                    FWUPD_ERROR_INVALID_DATA,
2172
0
                    "constant FuStructEfiWinCertificate.certificate_type was not valid, "
2173
0
                    "expected 0x%x and got 0x%x",
2174
0
                    (guint) 0x0EF1,
2175
0
                    (guint) fu_struct_efi_win_certificate_get_certificate_type(st));
2176
0
        return FALSE;
2177
0
    }
2178
0
    if (memcmp(fu_struct_efi_win_certificate_get_guid(st), "\x9d\xd2\xaf\x4a\xdf\x68\xee\x49\x8a\xa9\x34\x7d\x37\x56\x65\xa7", 16) != 0) {
2179
0
        g_set_error_literal(error,
2180
0
                            FWUPD_ERROR,
2181
0
                            FWUPD_ERROR_INVALID_DATA,
2182
0
                            "constant FuStructEfiWinCertificate.guid was not valid");
2183
0
        return FALSE;
2184
0
    }
2185
0
    return TRUE;
2186
0
}
2187
/* getters */
2188
/**
2189
 * fu_struct_efi_variable_authentication2_get_timestamp: (skip):
2190
 **/
2191
FuStructEfiTime *
2192
fu_struct_efi_variable_authentication2_get_timestamp(const FuStructEfiVariableAuthentication2 *st)
2193
0
{
2194
0
    g_autoptr(GByteArray) buf = g_byte_array_new();
2195
0
    g_return_val_if_fail(st != NULL, NULL);
2196
0
    g_byte_array_append(buf, st->data + FU_STRUCT_EFI_VARIABLE_AUTHENTICATION2_OFFSET_TIMESTAMP, 16);
2197
0
    return g_steal_pointer(&buf);
2198
0
}
2199
/**
2200
 * fu_struct_efi_variable_authentication2_get_auth_info: (skip):
2201
 **/
2202
FuStructEfiWinCertificate *
2203
fu_struct_efi_variable_authentication2_get_auth_info(const FuStructEfiVariableAuthentication2 *st)
2204
0
{
2205
0
    g_autoptr(GByteArray) buf = g_byte_array_new();
2206
0
    g_return_val_if_fail(st != NULL, NULL);
2207
0
    g_byte_array_append(buf, st->data + FU_STRUCT_EFI_VARIABLE_AUTHENTICATION2_OFFSET_AUTH_INFO, 24);
2208
0
    return g_steal_pointer(&buf);
2209
0
}
2210
2211
/* setters */
2212
/**
2213
 * fu_struct_efi_variable_authentication2_set_timestamp: (skip):
2214
 **/
2215
gboolean
2216
fu_struct_efi_variable_authentication2_set_timestamp(FuStructEfiVariableAuthentication2 *st, const FuStructEfiTime *st_donor, GError **error)
2217
0
{
2218
0
    g_return_val_if_fail(st != NULL, FALSE);
2219
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
2220
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
2221
2222
0
    if (st_donor->len > FU_STRUCT_EFI_TIME_SIZE) {
2223
0
        g_set_error(error,
2224
0
                    FWUPD_ERROR,
2225
0
                    FWUPD_ERROR_INVALID_DATA,
2226
0
                    "donor 'FuStructEfiTime' (0x%x bytes) does not fit in "
2227
0
                    "FuStructEfiVariableAuthentication2.timestamp (0x%x bytes)",
2228
0
                    (guint) st_donor->len,
2229
0
                    (guint) FU_STRUCT_EFI_TIME_SIZE);
2230
0
        return FALSE;
2231
0
    }
2232
0
    memcpy(st->data + FU_STRUCT_EFI_VARIABLE_AUTHENTICATION2_OFFSET_TIMESTAMP, st_donor->data, st_donor->len);
2233
0
    return TRUE;
2234
0
}
2235
/**
2236
 * fu_struct_efi_variable_authentication2_set_auth_info: (skip):
2237
 **/
2238
gboolean
2239
fu_struct_efi_variable_authentication2_set_auth_info(FuStructEfiVariableAuthentication2 *st, const FuStructEfiWinCertificate *st_donor, GError **error)
2240
0
{
2241
0
    g_return_val_if_fail(st != NULL, FALSE);
2242
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
2243
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
2244
2245
0
    if (st_donor->len > FU_STRUCT_EFI_WIN_CERTIFICATE_SIZE) {
2246
0
        g_set_error(error,
2247
0
                    FWUPD_ERROR,
2248
0
                    FWUPD_ERROR_INVALID_DATA,
2249
0
                    "donor 'FuStructEfiWinCertificate' (0x%x bytes) does not fit in "
2250
0
                    "FuStructEfiVariableAuthentication2.auth_info (0x%x bytes)",
2251
0
                    (guint) st_donor->len,
2252
0
                    (guint) FU_STRUCT_EFI_WIN_CERTIFICATE_SIZE);
2253
0
        return FALSE;
2254
0
    }
2255
0
    memcpy(st->data + FU_STRUCT_EFI_VARIABLE_AUTHENTICATION2_OFFSET_AUTH_INFO, st_donor->data, st_donor->len);
2256
0
    return TRUE;
2257
0
}
2258
/**
2259
 * fu_struct_efi_variable_authentication2_new: (skip):
2260
 **/
2261
FuStructEfiVariableAuthentication2 *
2262
fu_struct_efi_variable_authentication2_new(void)
2263
0
{
2264
0
    FuStructEfiVariableAuthentication2 *st = g_byte_array_sized_new(40);
2265
0
    fu_byte_array_set_size(st, 40, 0x0);
2266
0
    {
2267
0
        g_autoptr(GByteArray) st_donor = fu_struct_efi_time_new();
2268
0
        memcpy(st->data + 0x0, st_donor->data, st_donor->len); /* nocheck:blocked */
2269
0
    }
2270
0
    {
2271
0
        g_autoptr(GByteArray) st_donor = fu_struct_efi_win_certificate_new();
2272
0
        memcpy(st->data + 0x10, st_donor->data, st_donor->len); /* nocheck:blocked */
2273
0
    }
2274
0
    return st;
2275
0
}
2276
/**
2277
 * fu_struct_efi_variable_authentication2_to_string: (skip):
2278
 **/
2279
static gchar *
2280
fu_struct_efi_variable_authentication2_to_string(const FuStructEfiVariableAuthentication2 *st)
2281
0
{
2282
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVariableAuthentication2:\n");
2283
0
    g_return_val_if_fail(st != NULL, NULL);
2284
0
    {
2285
0
        g_autoptr(GByteArray) st_tmp = fu_struct_efi_variable_authentication2_get_timestamp(st);
2286
0
        g_autofree gchar *tmp = fu_struct_efi_time_to_string(st_tmp);
2287
0
        g_string_append_printf(str, "  timestamp: %s\n", tmp);
2288
0
    }
2289
0
    {
2290
0
        g_autoptr(GByteArray) st_tmp = fu_struct_efi_variable_authentication2_get_auth_info(st);
2291
0
        g_autofree gchar *tmp = fu_struct_efi_win_certificate_to_string(st_tmp);
2292
0
        g_string_append_printf(str, "  auth_info: %s\n", tmp);
2293
0
    }
2294
0
    if (str->len > 0)
2295
0
        g_string_set_size(str, str->len - 1);
2296
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2297
0
}
2298
static gboolean
2299
fu_struct_efi_variable_authentication2_validate_internal(FuStructEfiVariableAuthentication2 *st, GError **error)
2300
0
{
2301
0
    g_return_val_if_fail(st != NULL, FALSE);
2302
0
    {
2303
0
        GByteArray st_tmp = {
2304
0
            .data = (guint8*) st->data + 0x0,
2305
0
            .len = 16,
2306
0
        };
2307
0
        if (!fu_struct_efi_time_validate_internal(&st_tmp, error))
2308
0
            return FALSE;
2309
0
    }
2310
0
    {
2311
0
        GByteArray st_tmp = {
2312
0
            .data = (guint8*) st->data + 0x10,
2313
0
            .len = 24,
2314
0
        };
2315
0
        if (!fu_struct_efi_win_certificate_validate_internal(&st_tmp, error))
2316
0
            return FALSE;
2317
0
    }
2318
0
    return TRUE;
2319
0
}
2320
/**
2321
 * fu_struct_efi_variable_authentication2_validate_stream: (skip):
2322
 **/
2323
gboolean
2324
fu_struct_efi_variable_authentication2_validate_stream(GInputStream *stream, gsize offset, GError **error)
2325
0
{
2326
0
    g_autoptr(GByteArray) st = NULL;
2327
0
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
2328
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
2329
0
    st = fu_input_stream_read_byte_array(stream, offset, 40, NULL, error);
2330
0
    if (st == NULL) {
2331
0
        g_prefix_error(error, "FuStructEfiVariableAuthentication2 failed read of 0x%x: ", (guint) 40);
2332
0
        return FALSE;
2333
0
    }
2334
0
    if (st->len != 40) {
2335
0
        g_set_error(error,
2336
0
                    FWUPD_ERROR,
2337
0
                    FWUPD_ERROR_INVALID_DATA,
2338
0
                    "FuStructEfiVariableAuthentication2 requested 0x%x and got 0x%x",
2339
0
                    (guint) 40,
2340
0
                    (guint) st->len);
2341
0
        return FALSE;
2342
0
    }
2343
0
    return fu_struct_efi_variable_authentication2_validate_internal(st, error);
2344
0
}
2345
static gboolean
2346
fu_struct_efi_variable_authentication2_parse_internal(FuStructEfiVariableAuthentication2 *st, GError **error)
2347
0
{
2348
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
2349
0
        g_autofree gchar *str = fu_struct_efi_variable_authentication2_to_string(st);
2350
0
        g_debug("%s", str);
2351
0
    }
2352
0
    if (!fu_struct_efi_variable_authentication2_validate_internal(st, error))
2353
0
        return FALSE;
2354
0
    return TRUE;
2355
0
}
2356
/**
2357
 * fu_struct_efi_variable_authentication2_parse_stream: (skip):
2358
 **/
2359
FuStructEfiVariableAuthentication2 *
2360
fu_struct_efi_variable_authentication2_parse_stream(GInputStream *stream, gsize offset, GError **error)
2361
0
{
2362
0
    g_autoptr(GByteArray) st = NULL;
2363
0
    st = fu_input_stream_read_byte_array(stream, offset, 40, NULL, error);
2364
0
    if (st == NULL) {
2365
0
        g_prefix_error(error, "FuStructEfiVariableAuthentication2 failed read of 0x%x: ", (guint) 40);
2366
0
        return NULL;
2367
0
    }
2368
0
    if (st->len != 40) {
2369
0
        g_set_error(error,
2370
0
                    FWUPD_ERROR,
2371
0
                    FWUPD_ERROR_INVALID_DATA,
2372
0
                    "FuStructEfiVariableAuthentication2 requested 0x%x and got 0x%x",
2373
0
                    (guint) 40,
2374
0
                    (guint) st->len);
2375
0
        return NULL;
2376
0
    }
2377
0
    if (!fu_struct_efi_variable_authentication2_parse_internal(st, error))
2378
0
        return NULL;
2379
0
    return g_steal_pointer(&st);
2380
0
}
2381
/* getters */
2382
/**
2383
 * fu_struct_efi_signature_list_get_type: (skip):
2384
 **/
2385
const fwupd_guid_t *
2386
fu_struct_efi_signature_list_get_type(const FuStructEfiSignatureList *st)
2387
0
{
2388
0
    g_return_val_if_fail(st != NULL, NULL);
2389
0
    return (const fwupd_guid_t *) (st->data + 0);
2390
0
}
2391
/**
2392
 * fu_struct_efi_signature_list_get_list_size: (skip):
2393
 **/
2394
guint32
2395
fu_struct_efi_signature_list_get_list_size(const FuStructEfiSignatureList *st)
2396
0
{
2397
0
    g_return_val_if_fail(st != NULL, 0x0);
2398
0
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
2399
0
}
2400
/**
2401
 * fu_struct_efi_signature_list_get_header_size: (skip):
2402
 **/
2403
guint32
2404
fu_struct_efi_signature_list_get_header_size(const FuStructEfiSignatureList *st)
2405
0
{
2406
0
    g_return_val_if_fail(st != NULL, 0x0);
2407
0
    return fu_memread_uint32(st->data + 20, G_LITTLE_ENDIAN);
2408
0
}
2409
/**
2410
 * fu_struct_efi_signature_list_get_size: (skip):
2411
 **/
2412
guint32
2413
fu_struct_efi_signature_list_get_size(const FuStructEfiSignatureList *st)
2414
0
{
2415
0
    g_return_val_if_fail(st != NULL, 0x0);
2416
0
    return fu_memread_uint32(st->data + 24, G_LITTLE_ENDIAN);
2417
0
}
2418
2419
/* setters */
2420
/**
2421
 * fu_struct_efi_signature_list_set_type: (skip):
2422
 **/
2423
void
2424
fu_struct_efi_signature_list_set_type(FuStructEfiSignatureList *st, const fwupd_guid_t *value)
2425
0
{
2426
0
    g_return_if_fail(st != NULL);
2427
0
    g_return_if_fail(value != NULL);
2428
0
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
2429
0
}
2430
/**
2431
 * fu_struct_efi_signature_list_set_list_size: (skip):
2432
 **/
2433
void
2434
fu_struct_efi_signature_list_set_list_size(FuStructEfiSignatureList *st, guint32 value)
2435
0
{
2436
0
    g_return_if_fail(st != NULL);
2437
0
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
2438
0
}
2439
/**
2440
 * fu_struct_efi_signature_list_set_header_size: (skip):
2441
 **/
2442
void
2443
fu_struct_efi_signature_list_set_header_size(FuStructEfiSignatureList *st, guint32 value)
2444
0
{
2445
0
    g_return_if_fail(st != NULL);
2446
0
    fu_memwrite_uint32(st->data + 20, value, G_LITTLE_ENDIAN);
2447
0
}
2448
/**
2449
 * fu_struct_efi_signature_list_set_size: (skip):
2450
 **/
2451
void
2452
fu_struct_efi_signature_list_set_size(FuStructEfiSignatureList *st, guint32 value)
2453
0
{
2454
0
    g_return_if_fail(st != NULL);
2455
0
    fu_memwrite_uint32(st->data + 24, value, G_LITTLE_ENDIAN);
2456
0
}
2457
/**
2458
 * fu_struct_efi_signature_list_new: (skip):
2459
 **/
2460
FuStructEfiSignatureList *
2461
fu_struct_efi_signature_list_new(void)
2462
0
{
2463
0
    FuStructEfiSignatureList *st = g_byte_array_sized_new(28);
2464
0
    fu_byte_array_set_size(st, 28, 0x0);
2465
0
    return st;
2466
0
}
2467
/**
2468
 * fu_struct_efi_signature_list_to_string: (skip):
2469
 **/
2470
static gchar *
2471
fu_struct_efi_signature_list_to_string(const FuStructEfiSignatureList *st)
2472
0
{
2473
0
    g_autoptr(GString) str = g_string_new("FuStructEfiSignatureList:\n");
2474
0
    g_return_val_if_fail(st != NULL, NULL);
2475
0
    {
2476
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_signature_list_get_type(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
2477
0
        g_string_append_printf(str, "  type: %s\n", tmp);
2478
0
    }
2479
0
    g_string_append_printf(str, "  list_size: 0x%x\n",
2480
0
                           (guint) fu_struct_efi_signature_list_get_list_size(st));
2481
0
    g_string_append_printf(str, "  header_size: 0x%x\n",
2482
0
                           (guint) fu_struct_efi_signature_list_get_header_size(st));
2483
0
    g_string_append_printf(str, "  size: 0x%x\n",
2484
0
                           (guint) fu_struct_efi_signature_list_get_size(st));
2485
0
    if (str->len > 0)
2486
0
        g_string_set_size(str, str->len - 1);
2487
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2488
0
}
2489
static gboolean
2490
fu_struct_efi_signature_list_validate_internal(FuStructEfiSignatureList *st, GError **error)
2491
0
{
2492
0
    g_return_val_if_fail(st != NULL, FALSE);
2493
0
    return TRUE;
2494
0
}
2495
static gboolean
2496
fu_struct_efi_signature_list_parse_internal(FuStructEfiSignatureList *st, GError **error)
2497
0
{
2498
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
2499
0
        g_autofree gchar *str = fu_struct_efi_signature_list_to_string(st);
2500
0
        g_debug("%s", str);
2501
0
    }
2502
0
    if (!fu_struct_efi_signature_list_validate_internal(st, error))
2503
0
        return FALSE;
2504
0
    return TRUE;
2505
0
}
2506
/**
2507
 * fu_struct_efi_signature_list_parse_stream: (skip):
2508
 **/
2509
FuStructEfiSignatureList *
2510
fu_struct_efi_signature_list_parse_stream(GInputStream *stream, gsize offset, GError **error)
2511
0
{
2512
0
    g_autoptr(GByteArray) st = NULL;
2513
0
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
2514
0
    if (st == NULL) {
2515
0
        g_prefix_error(error, "FuStructEfiSignatureList failed read of 0x%x: ", (guint) 28);
2516
0
        return NULL;
2517
0
    }
2518
0
    if (st->len != 28) {
2519
0
        g_set_error(error,
2520
0
                    FWUPD_ERROR,
2521
0
                    FWUPD_ERROR_INVALID_DATA,
2522
0
                    "FuStructEfiSignatureList requested 0x%x and got 0x%x",
2523
0
                    (guint) 28,
2524
0
                    (guint) st->len);
2525
0
        return NULL;
2526
0
    }
2527
0
    if (!fu_struct_efi_signature_list_parse_internal(st, error))
2528
0
        return NULL;
2529
0
    return g_steal_pointer(&st);
2530
0
}
2531
/* getters */
2532
/**
2533
 * fu_struct_efi_load_option_get_attrs: (skip):
2534
 **/
2535
FuEfiLoadOptionAttrs
2536
fu_struct_efi_load_option_get_attrs(const FuStructEfiLoadOption *st)
2537
2.07k
{
2538
2.07k
    g_return_val_if_fail(st != NULL, 0x0);
2539
2.07k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
2540
2.07k
}
2541
/**
2542
 * fu_struct_efi_load_option_get_dp_size: (skip):
2543
 **/
2544
guint16
2545
fu_struct_efi_load_option_get_dp_size(const FuStructEfiLoadOption *st)
2546
1.60k
{
2547
1.60k
    g_return_val_if_fail(st != NULL, 0x0);
2548
1.60k
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
2549
1.60k
}
2550
2551
/* setters */
2552
/**
2553
 * fu_struct_efi_load_option_set_attrs: (skip):
2554
 **/
2555
void
2556
fu_struct_efi_load_option_set_attrs(FuStructEfiLoadOption *st, FuEfiLoadOptionAttrs value)
2557
1.20k
{
2558
1.20k
    g_return_if_fail(st != NULL);
2559
1.20k
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
2560
1.20k
}
2561
/**
2562
 * fu_struct_efi_load_option_set_dp_size: (skip):
2563
 **/
2564
void
2565
fu_struct_efi_load_option_set_dp_size(FuStructEfiLoadOption *st, guint16 value)
2566
795
{
2567
795
    g_return_if_fail(st != NULL);
2568
795
    fu_memwrite_uint16(st->data + 4, value, G_LITTLE_ENDIAN);
2569
795
}
2570
/**
2571
 * fu_struct_efi_load_option_new: (skip):
2572
 **/
2573
FuStructEfiLoadOption *
2574
fu_struct_efi_load_option_new(void)
2575
1.20k
{
2576
1.20k
    FuStructEfiLoadOption *st = g_byte_array_sized_new(6);
2577
1.20k
    fu_byte_array_set_size(st, 6, 0x0);
2578
1.20k
    return st;
2579
1.20k
}
2580
/**
2581
 * fu_struct_efi_load_option_to_string: (skip):
2582
 **/
2583
static gchar *
2584
fu_struct_efi_load_option_to_string(const FuStructEfiLoadOption *st)
2585
0
{
2586
0
    g_autoptr(GString) str = g_string_new("FuStructEfiLoadOption:\n");
2587
0
    g_return_val_if_fail(st != NULL, NULL);
2588
0
    {
2589
0
        const gchar *tmp = fu_efi_load_option_attrs_to_string(fu_struct_efi_load_option_get_attrs(st));
2590
0
        if (tmp != NULL) {
2591
0
            g_string_append_printf(str, "  attrs: 0x%x [%s]\n", (guint) fu_struct_efi_load_option_get_attrs(st), tmp);
2592
0
        } else {
2593
0
            g_string_append_printf(str, "  attrs: 0x%x\n", (guint) fu_struct_efi_load_option_get_attrs(st));
2594
0
        }
2595
0
    }
2596
0
    g_string_append_printf(str, "  dp_size: 0x%x\n",
2597
0
                           (guint) fu_struct_efi_load_option_get_dp_size(st));
2598
0
    if (str->len > 0)
2599
0
        g_string_set_size(str, str->len - 1);
2600
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2601
0
}
2602
static gboolean
2603
fu_struct_efi_load_option_validate_internal(FuStructEfiLoadOption *st, GError **error)
2604
2.07k
{
2605
2.07k
    g_return_val_if_fail(st != NULL, FALSE);
2606
2.07k
    return TRUE;
2607
2.07k
}
2608
static gboolean
2609
fu_struct_efi_load_option_parse_internal(FuStructEfiLoadOption *st, GError **error)
2610
2.07k
{
2611
2.07k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
2612
0
        g_autofree gchar *str = fu_struct_efi_load_option_to_string(st);
2613
0
        g_debug("%s", str);
2614
0
    }
2615
2.07k
    if (!fu_struct_efi_load_option_validate_internal(st, error))
2616
0
        return FALSE;
2617
2.07k
    return TRUE;
2618
2.07k
}
2619
/**
2620
 * fu_struct_efi_load_option_parse_stream: (skip):
2621
 **/
2622
FuStructEfiLoadOption *
2623
fu_struct_efi_load_option_parse_stream(GInputStream *stream, gsize offset, GError **error)
2624
2.08k
{
2625
2.08k
    g_autoptr(GByteArray) st = NULL;
2626
2.08k
    st = fu_input_stream_read_byte_array(stream, offset, 6, NULL, error);
2627
2.08k
    if (st == NULL) {
2628
0
        g_prefix_error(error, "FuStructEfiLoadOption failed read of 0x%x: ", (guint) 6);
2629
0
        return NULL;
2630
0
    }
2631
2.08k
    if (st->len != 6) {
2632
7
        g_set_error(error,
2633
7
                    FWUPD_ERROR,
2634
7
                    FWUPD_ERROR_INVALID_DATA,
2635
7
                    "FuStructEfiLoadOption requested 0x%x and got 0x%x",
2636
7
                    (guint) 6,
2637
7
                    (guint) st->len);
2638
7
        return NULL;
2639
7
    }
2640
2.07k
    if (!fu_struct_efi_load_option_parse_internal(st, error))
2641
0
        return NULL;
2642
2.07k
    return g_steal_pointer(&st);
2643
2.07k
}
2644
/* getters */
2645
/**
2646
 * fu_struct_efi_device_path_get_type: (skip):
2647
 **/
2648
FuEfiDevicePathType
2649
fu_struct_efi_device_path_get_type(const FuStructEfiDevicePath *st)
2650
94.7k
{
2651
94.7k
    g_return_val_if_fail(st != NULL, 0x0);
2652
94.7k
    return st->data[0];
2653
94.7k
}
2654
/**
2655
 * fu_struct_efi_device_path_get_subtype: (skip):
2656
 **/
2657
guint8
2658
fu_struct_efi_device_path_get_subtype(const FuStructEfiDevicePath *st)
2659
41.5k
{
2660
41.5k
    g_return_val_if_fail(st != NULL, 0x0);
2661
41.5k
    return st->data[1];
2662
41.5k
}
2663
/**
2664
 * fu_struct_efi_device_path_get_length: (skip):
2665
 **/
2666
guint16
2667
fu_struct_efi_device_path_get_length(const FuStructEfiDevicePath *st)
2668
49.0k
{
2669
49.0k
    g_return_val_if_fail(st != NULL, 0x0);
2670
49.0k
    return fu_memread_uint16(st->data + 2, G_LITTLE_ENDIAN);
2671
49.0k
}
2672
2673
/* setters */
2674
/**
2675
 * fu_struct_efi_device_path_set_type: (skip):
2676
 **/
2677
void
2678
fu_struct_efi_device_path_set_type(FuStructEfiDevicePath *st, FuEfiDevicePathType value)
2679
8.18k
{
2680
8.18k
    g_return_if_fail(st != NULL);
2681
8.18k
    st->data[0] = value;
2682
8.18k
}
2683
/**
2684
 * fu_struct_efi_device_path_set_subtype: (skip):
2685
 **/
2686
void
2687
fu_struct_efi_device_path_set_subtype(FuStructEfiDevicePath *st, guint8 value)
2688
16.7k
{
2689
16.7k
    g_return_if_fail(st != NULL);
2690
16.7k
    st->data[1] = value;
2691
16.7k
}
2692
/**
2693
 * fu_struct_efi_device_path_set_length: (skip):
2694
 **/
2695
void
2696
fu_struct_efi_device_path_set_length(FuStructEfiDevicePath *st, guint16 value)
2697
15.9k
{
2698
15.9k
    g_return_if_fail(st != NULL);
2699
15.9k
    fu_memwrite_uint16(st->data + 2, value, G_LITTLE_ENDIAN);
2700
15.9k
}
2701
/**
2702
 * fu_struct_efi_device_path_new: (skip):
2703
 **/
2704
FuStructEfiDevicePath *
2705
fu_struct_efi_device_path_new(void)
2706
8.59k
{
2707
8.59k
    FuStructEfiDevicePath *st = g_byte_array_sized_new(4);
2708
8.59k
    fu_byte_array_set_size(st, 4, 0x0);
2709
8.59k
    fu_struct_efi_device_path_set_subtype(st, 0xFF);
2710
8.59k
    fu_struct_efi_device_path_set_length(st, 4);
2711
8.59k
    return st;
2712
8.59k
}
2713
/**
2714
 * fu_struct_efi_device_path_to_string: (skip):
2715
 **/
2716
static gchar *
2717
fu_struct_efi_device_path_to_string(const FuStructEfiDevicePath *st)
2718
0
{
2719
0
    g_autoptr(GString) str = g_string_new("FuStructEfiDevicePath:\n");
2720
0
    g_return_val_if_fail(st != NULL, NULL);
2721
0
    {
2722
0
        const gchar *tmp = fu_efi_device_path_type_to_string(fu_struct_efi_device_path_get_type(st));
2723
0
        if (tmp != NULL) {
2724
0
            g_string_append_printf(str, "  type: 0x%x [%s]\n", (guint) fu_struct_efi_device_path_get_type(st), tmp);
2725
0
        } else {
2726
0
            g_string_append_printf(str, "  type: 0x%x\n", (guint) fu_struct_efi_device_path_get_type(st));
2727
0
        }
2728
0
    }
2729
0
    g_string_append_printf(str, "  subtype: 0x%x\n",
2730
0
                           (guint) fu_struct_efi_device_path_get_subtype(st));
2731
0
    g_string_append_printf(str, "  length: 0x%x\n",
2732
0
                           (guint) fu_struct_efi_device_path_get_length(st));
2733
0
    if (str->len > 0)
2734
0
        g_string_set_size(str, str->len - 1);
2735
0
    return g_string_free(g_steal_pointer(&str), FALSE);
2736
0
}
2737
static gboolean
2738
fu_struct_efi_device_path_validate_internal(FuStructEfiDevicePath *st, GError **error)
2739
48.7k
{
2740
48.7k
    g_return_val_if_fail(st != NULL, FALSE);
2741
48.7k
    return TRUE;
2742
48.7k
}
2743
static gboolean
2744
fu_struct_efi_device_path_parse_internal(FuStructEfiDevicePath *st, GError **error)
2745
48.7k
{
2746
48.7k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
2747
0
        g_autofree gchar *str = fu_struct_efi_device_path_to_string(st);
2748
0
        g_debug("%s", str);
2749
0
    }
2750
48.7k
    if (!fu_struct_efi_device_path_validate_internal(st, error))
2751
0
        return FALSE;
2752
48.7k
    return TRUE;
2753
48.7k
}
2754
/**
2755
 * fu_struct_efi_device_path_parse_stream: (skip):
2756
 **/
2757
FuStructEfiDevicePath *
2758
fu_struct_efi_device_path_parse_stream(GInputStream *stream, gsize offset, GError **error)
2759
48.7k
{
2760
48.7k
    g_autoptr(GByteArray) st = NULL;
2761
48.7k
    st = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
2762
48.7k
    if (st == NULL) {
2763
0
        g_prefix_error(error, "FuStructEfiDevicePath failed read of 0x%x: ", (guint) 4);
2764
0
        return NULL;
2765
0
    }
2766
48.7k
    if (st->len != 4) {
2767
40
        g_set_error(error,
2768
40
                    FWUPD_ERROR,
2769
40
                    FWUPD_ERROR_INVALID_DATA,
2770
40
                    "FuStructEfiDevicePath requested 0x%x and got 0x%x",
2771
40
                    (guint) 4,
2772
40
                    (guint) st->len);
2773
40
        return NULL;
2774
40
    }
2775
48.7k
    if (!fu_struct_efi_device_path_parse_internal(st, error))
2776
0
        return NULL;
2777
48.7k
    return g_steal_pointer(&st);
2778
48.7k
}
2779
/* getters */
2780
/**
2781
 * fu_struct_efi_hard_drive_device_path_get_type: (skip):
2782
 **/
2783
static FuEfiDevicePathType
2784
fu_struct_efi_hard_drive_device_path_get_type(const FuStructEfiHardDriveDevicePath *st)
2785
633
{
2786
633
    g_return_val_if_fail(st != NULL, 0x0);
2787
633
    return st->data[0];
2788
633
}
2789
/**
2790
 * fu_struct_efi_hard_drive_device_path_get_subtype: (skip):
2791
 **/
2792
FuEfiHardDriveDevicePathSubtype
2793
fu_struct_efi_hard_drive_device_path_get_subtype(const FuStructEfiHardDriveDevicePath *st)
2794
0
{
2795
0
    g_return_val_if_fail(st != NULL, 0x0);
2796
0
    return st->data[1];
2797
0
}
2798
/**
2799
 * fu_struct_efi_hard_drive_device_path_get_length: (skip):
2800
 **/
2801
static guint16
2802
fu_struct_efi_hard_drive_device_path_get_length(const FuStructEfiHardDriveDevicePath *st)
2803
653
{
2804
653
    g_return_val_if_fail(st != NULL, 0x0);
2805
653
    return fu_memread_uint16(st->data + 2, G_LITTLE_ENDIAN);
2806
653
}
2807
/**
2808
 * fu_struct_efi_hard_drive_device_path_get_partition_number: (skip):
2809
 **/
2810
guint32
2811
fu_struct_efi_hard_drive_device_path_get_partition_number(const FuStructEfiHardDriveDevicePath *st)
2812
613
{
2813
613
    g_return_val_if_fail(st != NULL, 0x0);
2814
613
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
2815
613
}
2816
/**
2817
 * fu_struct_efi_hard_drive_device_path_get_partition_start: (skip):
2818
 **/
2819
guint64
2820
fu_struct_efi_hard_drive_device_path_get_partition_start(const FuStructEfiHardDriveDevicePath *st)
2821
613
{
2822
613
    g_return_val_if_fail(st != NULL, 0x0);
2823
613
    return fu_memread_uint64(st->data + 8, G_LITTLE_ENDIAN);
2824
613
}
2825
/**
2826
 * fu_struct_efi_hard_drive_device_path_get_partition_size: (skip):
2827
 **/
2828
guint64
2829
fu_struct_efi_hard_drive_device_path_get_partition_size(const FuStructEfiHardDriveDevicePath *st)
2830
613
{
2831
613
    g_return_val_if_fail(st != NULL, 0x0);
2832
613
    return fu_memread_uint64(st->data + 16, G_LITTLE_ENDIAN);
2833
613
}
2834
/**
2835
 * fu_struct_efi_hard_drive_device_path_get_partition_signature: (skip):
2836
 **/
2837
const fwupd_guid_t *
2838
fu_struct_efi_hard_drive_device_path_get_partition_signature(const FuStructEfiHardDriveDevicePath *st)
2839
613
{
2840
613
    g_return_val_if_fail(st != NULL, NULL);
2841
613
    return (const fwupd_guid_t *) (st->data + 24);
2842
613
}
2843
/**
2844
 * fu_struct_efi_hard_drive_device_path_get_partition_format: (skip):
2845
 **/
2846
FuEfiHardDriveDevicePathPartitionFormat
2847
fu_struct_efi_hard_drive_device_path_get_partition_format(const FuStructEfiHardDriveDevicePath *st)
2848
613
{
2849
613
    g_return_val_if_fail(st != NULL, 0x0);
2850
613
    return st->data[40];
2851
613
}
2852
/**
2853
 * fu_struct_efi_hard_drive_device_path_get_signature_type: (skip):
2854
 **/
2855
FuEfiHardDriveDevicePathSignatureType
2856
fu_struct_efi_hard_drive_device_path_get_signature_type(const FuStructEfiHardDriveDevicePath *st)
2857
613
{
2858
613
    g_return_val_if_fail(st != NULL, 0x0);
2859
613
    return st->data[41];
2860
613
}
2861
2862
/* setters */
2863
/**
2864
 * fu_struct_efi_hard_drive_device_path_set_type: (skip):
2865
 **/
2866
static void
2867
fu_struct_efi_hard_drive_device_path_set_type(FuStructEfiHardDriveDevicePath *st, FuEfiDevicePathType value)
2868
385
{
2869
385
    g_return_if_fail(st != NULL);
2870
385
    st->data[0] = value;
2871
385
}
2872
/**
2873
 * fu_struct_efi_hard_drive_device_path_set_subtype: (skip):
2874
 **/
2875
void
2876
fu_struct_efi_hard_drive_device_path_set_subtype(FuStructEfiHardDriveDevicePath *st, FuEfiHardDriveDevicePathSubtype value)
2877
385
{
2878
385
    g_return_if_fail(st != NULL);
2879
385
    st->data[1] = value;
2880
385
}
2881
/**
2882
 * fu_struct_efi_hard_drive_device_path_set_length: (skip):
2883
 **/
2884
static void
2885
fu_struct_efi_hard_drive_device_path_set_length(FuStructEfiHardDriveDevicePath *st, guint16 value)
2886
385
{
2887
385
    g_return_if_fail(st != NULL);
2888
385
    fu_memwrite_uint16(st->data + 2, value, G_LITTLE_ENDIAN);
2889
385
}
2890
/**
2891
 * fu_struct_efi_hard_drive_device_path_set_partition_number: (skip):
2892
 **/
2893
void
2894
fu_struct_efi_hard_drive_device_path_set_partition_number(FuStructEfiHardDriveDevicePath *st, guint32 value)
2895
385
{
2896
385
    g_return_if_fail(st != NULL);
2897
385
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
2898
385
}
2899
/**
2900
 * fu_struct_efi_hard_drive_device_path_set_partition_start: (skip):
2901
 **/
2902
void
2903
fu_struct_efi_hard_drive_device_path_set_partition_start(FuStructEfiHardDriveDevicePath *st, guint64 value)
2904
385
{
2905
385
    g_return_if_fail(st != NULL);
2906
385
    fu_memwrite_uint64(st->data + 8, value, G_LITTLE_ENDIAN);
2907
385
}
2908
/**
2909
 * fu_struct_efi_hard_drive_device_path_set_partition_size: (skip):
2910
 **/
2911
void
2912
fu_struct_efi_hard_drive_device_path_set_partition_size(FuStructEfiHardDriveDevicePath *st, guint64 value)
2913
385
{
2914
385
    g_return_if_fail(st != NULL);
2915
385
    fu_memwrite_uint64(st->data + 16, value, G_LITTLE_ENDIAN);
2916
385
}
2917
/**
2918
 * fu_struct_efi_hard_drive_device_path_set_partition_signature: (skip):
2919
 **/
2920
void
2921
fu_struct_efi_hard_drive_device_path_set_partition_signature(FuStructEfiHardDriveDevicePath *st, const fwupd_guid_t *value)
2922
385
{
2923
385
    g_return_if_fail(st != NULL);
2924
385
    g_return_if_fail(value != NULL);
2925
385
    memcpy(st->data + 24, value, sizeof(*value)); /* nocheck:blocked */
2926
385
}
2927
/**
2928
 * fu_struct_efi_hard_drive_device_path_set_partition_format: (skip):
2929
 **/
2930
void
2931
fu_struct_efi_hard_drive_device_path_set_partition_format(FuStructEfiHardDriveDevicePath *st, FuEfiHardDriveDevicePathPartitionFormat value)
2932
770
{
2933
770
    g_return_if_fail(st != NULL);
2934
770
    st->data[40] = value;
2935
770
}
2936
/**
2937
 * fu_struct_efi_hard_drive_device_path_set_signature_type: (skip):
2938
 **/
2939
void
2940
fu_struct_efi_hard_drive_device_path_set_signature_type(FuStructEfiHardDriveDevicePath *st, FuEfiHardDriveDevicePathSignatureType value)
2941
770
{
2942
770
    g_return_if_fail(st != NULL);
2943
770
    st->data[41] = value;
2944
770
}
2945
/**
2946
 * fu_struct_efi_hard_drive_device_path_new: (skip):
2947
 **/
2948
FuStructEfiHardDriveDevicePath *
2949
fu_struct_efi_hard_drive_device_path_new(void)
2950
385
{
2951
385
    FuStructEfiHardDriveDevicePath *st = g_byte_array_sized_new(42);
2952
385
    fu_byte_array_set_size(st, 42, 0x0);
2953
385
    fu_struct_efi_hard_drive_device_path_set_type(st, FU_EFI_DEVICE_PATH_TYPE_MEDIA);
2954
385
    fu_struct_efi_hard_drive_device_path_set_subtype(st, FU_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE_HARD_DRIVE);
2955
385
    fu_struct_efi_hard_drive_device_path_set_length(st, 42);
2956
385
    fu_struct_efi_hard_drive_device_path_set_partition_format(st, FU_EFI_HARD_DRIVE_DEVICE_PATH_PARTITION_FORMAT_GUID_PARTITION_TABLE);
2957
385
    fu_struct_efi_hard_drive_device_path_set_signature_type(st, FU_EFI_HARD_DRIVE_DEVICE_PATH_SIGNATURE_TYPE_GUID);
2958
385
    return st;
2959
385
}
2960
/**
2961
 * fu_struct_efi_hard_drive_device_path_to_string: (skip):
2962
 **/
2963
static gchar *
2964
fu_struct_efi_hard_drive_device_path_to_string(const FuStructEfiHardDriveDevicePath *st)
2965
0
{
2966
0
    g_autoptr(GString) str = g_string_new("FuStructEfiHardDriveDevicePath:\n");
2967
0
    g_return_val_if_fail(st != NULL, NULL);
2968
0
    {
2969
0
        const gchar *tmp = fu_efi_hard_drive_device_path_subtype_to_string(fu_struct_efi_hard_drive_device_path_get_subtype(st));
2970
0
        if (tmp != NULL) {
2971
0
            g_string_append_printf(str, "  subtype: 0x%x [%s]\n", (guint) fu_struct_efi_hard_drive_device_path_get_subtype(st), tmp);
2972
0
        } else {
2973
0
            g_string_append_printf(str, "  subtype: 0x%x\n", (guint) fu_struct_efi_hard_drive_device_path_get_subtype(st));
2974
0
        }
2975
0
    }
2976
0
    g_string_append_printf(str, "  partition_number: 0x%x\n",
2977
0
                           (guint) fu_struct_efi_hard_drive_device_path_get_partition_number(st));
2978
0
    g_string_append_printf(str, "  partition_start: 0x%x\n",
2979
0
                           (guint) fu_struct_efi_hard_drive_device_path_get_partition_start(st));
2980
0
    g_string_append_printf(str, "  partition_size: 0x%x\n",
2981
0
                           (guint) fu_struct_efi_hard_drive_device_path_get_partition_size(st));
2982
0
    {
2983
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_hard_drive_device_path_get_partition_signature(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
2984
0
        g_string_append_printf(str, "  partition_signature: %s\n", tmp);
2985
0
    }
2986
0
    {
2987
0
        const gchar *tmp = fu_efi_hard_drive_device_path_partition_format_to_string(fu_struct_efi_hard_drive_device_path_get_partition_format(st));
2988
0
        if (tmp != NULL) {
2989
0
            g_string_append_printf(str, "  partition_format: 0x%x [%s]\n", (guint) fu_struct_efi_hard_drive_device_path_get_partition_format(st), tmp);
2990
0
        } else {
2991
0
            g_string_append_printf(str, "  partition_format: 0x%x\n", (guint) fu_struct_efi_hard_drive_device_path_get_partition_format(st));
2992
0
        }
2993
0
    }
2994
0
    {
2995
0
        const gchar *tmp = fu_efi_hard_drive_device_path_signature_type_to_string(fu_struct_efi_hard_drive_device_path_get_signature_type(st));
2996
0
        if (tmp != NULL) {
2997
0
            g_string_append_printf(str, "  signature_type: 0x%x [%s]\n", (guint) fu_struct_efi_hard_drive_device_path_get_signature_type(st), tmp);
2998
0
        } else {
2999
0
            g_string_append_printf(str, "  signature_type: 0x%x\n", (guint) fu_struct_efi_hard_drive_device_path_get_signature_type(st));
3000
0
        }
3001
0
    }
3002
0
    if (str->len > 0)
3003
0
        g_string_set_size(str, str->len - 1);
3004
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3005
0
}
3006
static gboolean
3007
fu_struct_efi_hard_drive_device_path_validate_internal(FuStructEfiHardDriveDevicePath *st, GError **error)
3008
633
{
3009
633
    g_return_val_if_fail(st != NULL, FALSE);
3010
633
    if (fu_struct_efi_hard_drive_device_path_get_type(st) != FU_EFI_DEVICE_PATH_TYPE_MEDIA) {
3011
0
        g_set_error_literal(error,
3012
0
                            FWUPD_ERROR,
3013
0
                            FWUPD_ERROR_INVALID_DATA,
3014
0
                            "constant FuStructEfiHardDriveDevicePath.type was not valid");
3015
0
        return FALSE;
3016
0
    }
3017
633
    if (fu_struct_efi_hard_drive_device_path_get_length(st) != 42) {
3018
20
        g_set_error(error,
3019
20
                    FWUPD_ERROR,
3020
20
                    FWUPD_ERROR_INVALID_DATA,
3021
20
                    "constant FuStructEfiHardDriveDevicePath.length was not valid, "
3022
20
                    "expected 0x%x and got 0x%x",
3023
20
                    (guint) 42,
3024
20
                    (guint) fu_struct_efi_hard_drive_device_path_get_length(st));
3025
20
        return FALSE;
3026
20
    }
3027
613
    return TRUE;
3028
633
}
3029
static gboolean
3030
fu_struct_efi_hard_drive_device_path_parse_internal(FuStructEfiHardDriveDevicePath *st, GError **error)
3031
633
{
3032
633
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
3033
0
        g_autofree gchar *str = fu_struct_efi_hard_drive_device_path_to_string(st);
3034
0
        g_debug("%s", str);
3035
0
    }
3036
633
    if (!fu_struct_efi_hard_drive_device_path_validate_internal(st, error))
3037
20
        return FALSE;
3038
613
    return TRUE;
3039
633
}
3040
/**
3041
 * fu_struct_efi_hard_drive_device_path_parse_stream: (skip):
3042
 **/
3043
FuStructEfiHardDriveDevicePath *
3044
fu_struct_efi_hard_drive_device_path_parse_stream(GInputStream *stream, gsize offset, GError **error)
3045
647
{
3046
647
    g_autoptr(GByteArray) st = NULL;
3047
647
    st = fu_input_stream_read_byte_array(stream, offset, 42, NULL, error);
3048
647
    if (st == NULL) {
3049
0
        g_prefix_error(error, "FuStructEfiHardDriveDevicePath failed read of 0x%x: ", (guint) 42);
3050
0
        return NULL;
3051
0
    }
3052
647
    if (st->len != 42) {
3053
14
        g_set_error(error,
3054
14
                    FWUPD_ERROR,
3055
14
                    FWUPD_ERROR_INVALID_DATA,
3056
14
                    "FuStructEfiHardDriveDevicePath requested 0x%x and got 0x%x",
3057
14
                    (guint) 42,
3058
14
                    (guint) st->len);
3059
14
        return NULL;
3060
14
    }
3061
633
    if (!fu_struct_efi_hard_drive_device_path_parse_internal(st, error))
3062
20
        return NULL;
3063
613
    return g_steal_pointer(&st);
3064
633
}
3065
/* getters */
3066
/**
3067
 * fu_struct_efi_vss2_variable_store_header_get_signature: (skip):
3068
 **/
3069
static const fwupd_guid_t *
3070
fu_struct_efi_vss2_variable_store_header_get_signature(const FuStructEfiVss2VariableStoreHeader *st)
3071
27.6k
{
3072
27.6k
    g_return_val_if_fail(st != NULL, NULL);
3073
27.6k
    return (const fwupd_guid_t *) (st->data + 0);
3074
27.6k
}
3075
/**
3076
 * fu_struct_efi_vss2_variable_store_header_get_size: (skip):
3077
 **/
3078
guint32
3079
fu_struct_efi_vss2_variable_store_header_get_size(const FuStructEfiVss2VariableStoreHeader *st)
3080
3.70k
{
3081
3.70k
    g_return_val_if_fail(st != NULL, 0x0);
3082
3.70k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
3083
3.70k
}
3084
/**
3085
 * fu_struct_efi_vss2_variable_store_header_get_format: (skip):
3086
 **/
3087
static FuEfiVariableStoreFormat
3088
fu_struct_efi_vss2_variable_store_header_get_format(const FuStructEfiVss2VariableStoreHeader *st)
3089
1.82k
{
3090
1.82k
    g_return_val_if_fail(st != NULL, 0x0);
3091
1.82k
    return st->data[20];
3092
1.82k
}
3093
/**
3094
 * fu_struct_efi_vss2_variable_store_header_get_state: (skip):
3095
 **/
3096
static FuEfiVariableStoreState
3097
fu_struct_efi_vss2_variable_store_header_get_state(const FuStructEfiVss2VariableStoreHeader *st)
3098
1.80k
{
3099
1.80k
    g_return_val_if_fail(st != NULL, 0x0);
3100
1.80k
    return st->data[21];
3101
1.80k
}
3102
3103
/* setters */
3104
/**
3105
 * fu_struct_efi_vss2_variable_store_header_set_signature: (skip):
3106
 **/
3107
static void
3108
fu_struct_efi_vss2_variable_store_header_set_signature(FuStructEfiVss2VariableStoreHeader *st, const fwupd_guid_t *value)
3109
219
{
3110
219
    g_return_if_fail(st != NULL);
3111
219
    g_return_if_fail(value != NULL);
3112
219
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
3113
219
}
3114
/**
3115
 * fu_struct_efi_vss2_variable_store_header_set_size: (skip):
3116
 **/
3117
void
3118
fu_struct_efi_vss2_variable_store_header_set_size(FuStructEfiVss2VariableStoreHeader *st, guint32 value)
3119
151
{
3120
151
    g_return_if_fail(st != NULL);
3121
151
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
3122
151
}
3123
/**
3124
 * fu_struct_efi_vss2_variable_store_header_set_format: (skip):
3125
 **/
3126
static void
3127
fu_struct_efi_vss2_variable_store_header_set_format(FuStructEfiVss2VariableStoreHeader *st, FuEfiVariableStoreFormat value)
3128
219
{
3129
219
    g_return_if_fail(st != NULL);
3130
219
    st->data[20] = value;
3131
219
}
3132
/**
3133
 * fu_struct_efi_vss2_variable_store_header_set_state: (skip):
3134
 **/
3135
static void
3136
fu_struct_efi_vss2_variable_store_header_set_state(FuStructEfiVss2VariableStoreHeader *st, FuEfiVariableStoreState value)
3137
219
{
3138
219
    g_return_if_fail(st != NULL);
3139
219
    st->data[21] = value;
3140
219
}
3141
/**
3142
 * fu_struct_efi_vss2_variable_store_header_new: (skip):
3143
 **/
3144
FuStructEfiVss2VariableStoreHeader *
3145
fu_struct_efi_vss2_variable_store_header_new(void)
3146
219
{
3147
219
    FuStructEfiVss2VariableStoreHeader *st = g_byte_array_sized_new(28);
3148
219
    fu_byte_array_set_size(st, 28, 0x0);
3149
219
    fu_struct_efi_vss2_variable_store_header_set_signature(st, (fwupd_guid_t *) "\x78\x2c\xf3\xaa\x7b\x94\x9a\x43\xa1\x80\x2e\x14\x4e\xc3\x77\x92");
3150
219
    fu_struct_efi_vss2_variable_store_header_set_format(st, FU_EFI_VARIABLE_STORE_FORMAT_FORMATTED);
3151
219
    fu_struct_efi_vss2_variable_store_header_set_state(st, FU_EFI_VARIABLE_STORE_STATE_HEALTHY);
3152
219
    return st;
3153
219
}
3154
/**
3155
 * fu_struct_efi_vss2_variable_store_header_to_string: (skip):
3156
 **/
3157
static gchar *
3158
fu_struct_efi_vss2_variable_store_header_to_string(const FuStructEfiVss2VariableStoreHeader *st)
3159
0
{
3160
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVss2VariableStoreHeader:\n");
3161
0
    g_return_val_if_fail(st != NULL, NULL);
3162
0
    g_string_append_printf(str, "  size: 0x%x\n",
3163
0
                           (guint) fu_struct_efi_vss2_variable_store_header_get_size(st));
3164
0
    if (str->len > 0)
3165
0
        g_string_set_size(str, str->len - 1);
3166
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3167
0
}
3168
static gboolean
3169
fu_struct_efi_vss2_variable_store_header_validate_internal(FuStructEfiVss2VariableStoreHeader *st, GError **error)
3170
27.6k
{
3171
27.6k
    g_return_val_if_fail(st != NULL, FALSE);
3172
27.6k
    if (memcmp(fu_struct_efi_vss2_variable_store_header_get_signature(st), "\x78\x2c\xf3\xaa\x7b\x94\x9a\x43\xa1\x80\x2e\x14\x4e\xc3\x77\x92", 16) != 0) {
3173
25.8k
        g_set_error_literal(error,
3174
25.8k
                            FWUPD_ERROR,
3175
25.8k
                            FWUPD_ERROR_INVALID_DATA,
3176
25.8k
                            "constant FuStructEfiVss2VariableStoreHeader.signature was not valid");
3177
25.8k
        return FALSE;
3178
25.8k
    }
3179
1.82k
    if (fu_struct_efi_vss2_variable_store_header_get_format(st) != FU_EFI_VARIABLE_STORE_FORMAT_FORMATTED) {
3180
21
        g_set_error_literal(error,
3181
21
                            FWUPD_ERROR,
3182
21
                            FWUPD_ERROR_INVALID_DATA,
3183
21
                            "constant FuStructEfiVss2VariableStoreHeader.format was not valid");
3184
21
        return FALSE;
3185
21
    }
3186
1.80k
    if (fu_struct_efi_vss2_variable_store_header_get_state(st) != FU_EFI_VARIABLE_STORE_STATE_HEALTHY) {
3187
12
        g_set_error_literal(error,
3188
12
                            FWUPD_ERROR,
3189
12
                            FWUPD_ERROR_INVALID_DATA,
3190
12
                            "constant FuStructEfiVss2VariableStoreHeader.state was not valid");
3191
12
        return FALSE;
3192
12
    }
3193
1.79k
    return TRUE;
3194
1.80k
}
3195
/**
3196
 * fu_struct_efi_vss2_variable_store_header_validate_stream: (skip):
3197
 **/
3198
gboolean
3199
fu_struct_efi_vss2_variable_store_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
3200
27.0k
{
3201
27.0k
    g_autoptr(GByteArray) st = NULL;
3202
27.0k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
3203
27.0k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
3204
27.0k
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
3205
27.0k
    if (st == NULL) {
3206
0
        g_prefix_error(error, "FuStructEfiVss2VariableStoreHeader failed read of 0x%x: ", (guint) 28);
3207
0
        return FALSE;
3208
0
    }
3209
27.0k
    if (st->len != 28) {
3210
96
        g_set_error(error,
3211
96
                    FWUPD_ERROR,
3212
96
                    FWUPD_ERROR_INVALID_DATA,
3213
96
                    "FuStructEfiVss2VariableStoreHeader requested 0x%x and got 0x%x",
3214
96
                    (guint) 28,
3215
96
                    (guint) st->len);
3216
96
        return FALSE;
3217
96
    }
3218
26.9k
    return fu_struct_efi_vss2_variable_store_header_validate_internal(st, error);
3219
27.0k
}
3220
static gboolean
3221
fu_struct_efi_vss2_variable_store_header_parse_internal(FuStructEfiVss2VariableStoreHeader *st, GError **error)
3222
707
{
3223
707
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
3224
0
        g_autofree gchar *str = fu_struct_efi_vss2_variable_store_header_to_string(st);
3225
0
        g_debug("%s", str);
3226
0
    }
3227
707
    if (!fu_struct_efi_vss2_variable_store_header_validate_internal(st, error))
3228
0
        return FALSE;
3229
707
    return TRUE;
3230
707
}
3231
/**
3232
 * fu_struct_efi_vss2_variable_store_header_parse_stream: (skip):
3233
 **/
3234
FuStructEfiVss2VariableStoreHeader *
3235
fu_struct_efi_vss2_variable_store_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
3236
707
{
3237
707
    g_autoptr(GByteArray) st = NULL;
3238
707
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
3239
707
    if (st == NULL) {
3240
0
        g_prefix_error(error, "FuStructEfiVss2VariableStoreHeader failed read of 0x%x: ", (guint) 28);
3241
0
        return NULL;
3242
0
    }
3243
707
    if (st->len != 28) {
3244
0
        g_set_error(error,
3245
0
                    FWUPD_ERROR,
3246
0
                    FWUPD_ERROR_INVALID_DATA,
3247
0
                    "FuStructEfiVss2VariableStoreHeader requested 0x%x and got 0x%x",
3248
0
                    (guint) 28,
3249
0
                    (guint) st->len);
3250
0
        return NULL;
3251
0
    }
3252
707
    if (!fu_struct_efi_vss2_variable_store_header_parse_internal(st, error))
3253
0
        return NULL;
3254
707
    return g_steal_pointer(&st);
3255
707
}
3256
/* getters */
3257
/**
3258
 * fu_struct_efi_vss_auth_variable_header_get_start_id: (skip):
3259
 **/
3260
guint16
3261
fu_struct_efi_vss_auth_variable_header_get_start_id(const FuStructEfiVssAuthVariableHeader *st)
3262
4.79k
{
3263
4.79k
    g_return_val_if_fail(st != NULL, 0x0);
3264
4.79k
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
3265
4.79k
}
3266
/**
3267
 * fu_struct_efi_vss_auth_variable_header_get_state: (skip):
3268
 **/
3269
FuEfiVariableState
3270
fu_struct_efi_vss_auth_variable_header_get_state(const FuStructEfiVssAuthVariableHeader *st)
3271
2.31k
{
3272
2.31k
    g_return_val_if_fail(st != NULL, 0x0);
3273
2.31k
    return st->data[2];
3274
2.31k
}
3275
/**
3276
 * fu_struct_efi_vss_auth_variable_header_get_attributes: (skip):
3277
 **/
3278
FuEfiVariableAttributes
3279
fu_struct_efi_vss_auth_variable_header_get_attributes(const FuStructEfiVssAuthVariableHeader *st)
3280
2.31k
{
3281
2.31k
    g_return_val_if_fail(st != NULL, 0x0);
3282
2.31k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
3283
2.31k
}
3284
/**
3285
 * fu_struct_efi_vss_auth_variable_header_get_monotonic_counter: (skip):
3286
 **/
3287
guint64
3288
fu_struct_efi_vss_auth_variable_header_get_monotonic_counter(const FuStructEfiVssAuthVariableHeader *st)
3289
0
{
3290
0
    g_return_val_if_fail(st != NULL, 0x0);
3291
0
    return fu_memread_uint64(st->data + 8, G_LITTLE_ENDIAN);
3292
0
}
3293
/**
3294
 * fu_struct_efi_vss_auth_variable_header_get_timestamp: (skip):
3295
 **/
3296
FuStructEfiTime *
3297
fu_struct_efi_vss_auth_variable_header_get_timestamp(const FuStructEfiVssAuthVariableHeader *st)
3298
2.31k
{
3299
2.31k
    g_autoptr(GByteArray) buf = g_byte_array_new();
3300
2.31k
    g_return_val_if_fail(st != NULL, NULL);
3301
2.31k
    g_byte_array_append(buf, st->data + FU_STRUCT_EFI_VSS_AUTH_VARIABLE_HEADER_OFFSET_TIMESTAMP, 16);
3302
2.31k
    return g_steal_pointer(&buf);
3303
2.31k
}
3304
/**
3305
 * fu_struct_efi_vss_auth_variable_header_get_pubkey_index: (skip):
3306
 **/
3307
guint32
3308
fu_struct_efi_vss_auth_variable_header_get_pubkey_index(const FuStructEfiVssAuthVariableHeader *st)
3309
0
{
3310
0
    g_return_val_if_fail(st != NULL, 0x0);
3311
0
    return fu_memread_uint32(st->data + 32, G_LITTLE_ENDIAN);
3312
0
}
3313
/**
3314
 * fu_struct_efi_vss_auth_variable_header_get_name_size: (skip):
3315
 **/
3316
guint32
3317
fu_struct_efi_vss_auth_variable_header_get_name_size(const FuStructEfiVssAuthVariableHeader *st)
3318
4.58k
{
3319
4.58k
    g_return_val_if_fail(st != NULL, 0x0);
3320
4.58k
    return fu_memread_uint32(st->data + 36, G_LITTLE_ENDIAN);
3321
4.58k
}
3322
/**
3323
 * fu_struct_efi_vss_auth_variable_header_get_data_size: (skip):
3324
 **/
3325
guint32
3326
fu_struct_efi_vss_auth_variable_header_get_data_size(const FuStructEfiVssAuthVariableHeader *st)
3327
4.39k
{
3328
4.39k
    g_return_val_if_fail(st != NULL, 0x0);
3329
4.39k
    return fu_memread_uint32(st->data + 40, G_LITTLE_ENDIAN);
3330
4.39k
}
3331
/**
3332
 * fu_struct_efi_vss_auth_variable_header_get_vendor_guid: (skip):
3333
 **/
3334
const fwupd_guid_t *
3335
fu_struct_efi_vss_auth_variable_header_get_vendor_guid(const FuStructEfiVssAuthVariableHeader *st)
3336
2.31k
{
3337
2.31k
    g_return_val_if_fail(st != NULL, NULL);
3338
2.31k
    return (const fwupd_guid_t *) (st->data + 44);
3339
2.31k
}
3340
3341
/* setters */
3342
/**
3343
 * fu_struct_efi_vss_auth_variable_header_set_start_id: (skip):
3344
 **/
3345
void
3346
fu_struct_efi_vss_auth_variable_header_set_start_id(FuStructEfiVssAuthVariableHeader *st, guint16 value)
3347
312
{
3348
312
    g_return_if_fail(st != NULL);
3349
312
    fu_memwrite_uint16(st->data + 0, value, G_LITTLE_ENDIAN);
3350
312
}
3351
/**
3352
 * fu_struct_efi_vss_auth_variable_header_set_state: (skip):
3353
 **/
3354
void
3355
fu_struct_efi_vss_auth_variable_header_set_state(FuStructEfiVssAuthVariableHeader *st, FuEfiVariableState value)
3356
312
{
3357
312
    g_return_if_fail(st != NULL);
3358
312
    st->data[2] = value;
3359
312
}
3360
/**
3361
 * fu_struct_efi_vss_auth_variable_header_set_attributes: (skip):
3362
 **/
3363
void
3364
fu_struct_efi_vss_auth_variable_header_set_attributes(FuStructEfiVssAuthVariableHeader *st, FuEfiVariableAttributes value)
3365
312
{
3366
312
    g_return_if_fail(st != NULL);
3367
312
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
3368
312
}
3369
/**
3370
 * fu_struct_efi_vss_auth_variable_header_set_monotonic_counter: (skip):
3371
 **/
3372
void
3373
fu_struct_efi_vss_auth_variable_header_set_monotonic_counter(FuStructEfiVssAuthVariableHeader *st, guint64 value)
3374
0
{
3375
0
    g_return_if_fail(st != NULL);
3376
0
    fu_memwrite_uint64(st->data + 8, value, G_LITTLE_ENDIAN);
3377
0
}
3378
/**
3379
 * fu_struct_efi_vss_auth_variable_header_set_timestamp: (skip):
3380
 **/
3381
gboolean
3382
fu_struct_efi_vss_auth_variable_header_set_timestamp(FuStructEfiVssAuthVariableHeader *st, const FuStructEfiTime *st_donor, GError **error)
3383
312
{
3384
312
    g_return_val_if_fail(st != NULL, FALSE);
3385
312
    g_return_val_if_fail(st_donor != NULL, FALSE);
3386
312
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
3387
3388
312
    if (st_donor->len > FU_STRUCT_EFI_TIME_SIZE) {
3389
0
        g_set_error(error,
3390
0
                    FWUPD_ERROR,
3391
0
                    FWUPD_ERROR_INVALID_DATA,
3392
0
                    "donor 'FuStructEfiTime' (0x%x bytes) does not fit in "
3393
0
                    "FuStructEfiVssAuthVariableHeader.timestamp (0x%x bytes)",
3394
0
                    (guint) st_donor->len,
3395
0
                    (guint) FU_STRUCT_EFI_TIME_SIZE);
3396
0
        return FALSE;
3397
0
    }
3398
312
    memcpy(st->data + FU_STRUCT_EFI_VSS_AUTH_VARIABLE_HEADER_OFFSET_TIMESTAMP, st_donor->data, st_donor->len);
3399
312
    return TRUE;
3400
312
}
3401
/**
3402
 * fu_struct_efi_vss_auth_variable_header_set_pubkey_index: (skip):
3403
 **/
3404
void
3405
fu_struct_efi_vss_auth_variable_header_set_pubkey_index(FuStructEfiVssAuthVariableHeader *st, guint32 value)
3406
0
{
3407
0
    g_return_if_fail(st != NULL);
3408
0
    fu_memwrite_uint32(st->data + 32, value, G_LITTLE_ENDIAN);
3409
0
}
3410
/**
3411
 * fu_struct_efi_vss_auth_variable_header_set_name_size: (skip):
3412
 **/
3413
void
3414
fu_struct_efi_vss_auth_variable_header_set_name_size(FuStructEfiVssAuthVariableHeader *st, guint32 value)
3415
312
{
3416
312
    g_return_if_fail(st != NULL);
3417
312
    fu_memwrite_uint32(st->data + 36, value, G_LITTLE_ENDIAN);
3418
312
}
3419
/**
3420
 * fu_struct_efi_vss_auth_variable_header_set_data_size: (skip):
3421
 **/
3422
void
3423
fu_struct_efi_vss_auth_variable_header_set_data_size(FuStructEfiVssAuthVariableHeader *st, guint32 value)
3424
312
{
3425
312
    g_return_if_fail(st != NULL);
3426
312
    fu_memwrite_uint32(st->data + 40, value, G_LITTLE_ENDIAN);
3427
312
}
3428
/**
3429
 * fu_struct_efi_vss_auth_variable_header_set_vendor_guid: (skip):
3430
 **/
3431
void
3432
fu_struct_efi_vss_auth_variable_header_set_vendor_guid(FuStructEfiVssAuthVariableHeader *st, const fwupd_guid_t *value)
3433
312
{
3434
312
    g_return_if_fail(st != NULL);
3435
312
    g_return_if_fail(value != NULL);
3436
312
    memcpy(st->data + 44, value, sizeof(*value)); /* nocheck:blocked */
3437
312
}
3438
/**
3439
 * fu_struct_efi_vss_auth_variable_header_new: (skip):
3440
 **/
3441
FuStructEfiVssAuthVariableHeader *
3442
fu_struct_efi_vss_auth_variable_header_new(void)
3443
312
{
3444
312
    FuStructEfiVssAuthVariableHeader *st = g_byte_array_sized_new(60);
3445
312
    fu_byte_array_set_size(st, 60, 0x0);
3446
312
    {
3447
312
        g_autoptr(GByteArray) st_donor = fu_struct_efi_time_new();
3448
312
        memcpy(st->data + 0x10, st_donor->data, st_donor->len); /* nocheck:blocked */
3449
312
    }
3450
312
    fu_struct_efi_vss_auth_variable_header_set_start_id(st, 0x55AA);
3451
312
    return st;
3452
312
}
3453
/**
3454
 * fu_struct_efi_vss_auth_variable_header_to_string: (skip):
3455
 **/
3456
static gchar *
3457
fu_struct_efi_vss_auth_variable_header_to_string(const FuStructEfiVssAuthVariableHeader *st)
3458
0
{
3459
0
    g_autoptr(GString) str = g_string_new("FuStructEfiVssAuthVariableHeader:\n");
3460
0
    g_return_val_if_fail(st != NULL, NULL);
3461
0
    g_string_append_printf(str, "  start_id: 0x%x\n",
3462
0
                           (guint) fu_struct_efi_vss_auth_variable_header_get_start_id(st));
3463
0
    {
3464
0
        const gchar *tmp = fu_efi_variable_state_to_string(fu_struct_efi_vss_auth_variable_header_get_state(st));
3465
0
        if (tmp != NULL) {
3466
0
            g_string_append_printf(str, "  state: 0x%x [%s]\n", (guint) fu_struct_efi_vss_auth_variable_header_get_state(st), tmp);
3467
0
        } else {
3468
0
            g_string_append_printf(str, "  state: 0x%x\n", (guint) fu_struct_efi_vss_auth_variable_header_get_state(st));
3469
0
        }
3470
0
    }
3471
0
    {
3472
0
        const gchar *tmp = fu_efi_variable_attributes_to_string(fu_struct_efi_vss_auth_variable_header_get_attributes(st));
3473
0
        if (tmp != NULL) {
3474
0
            g_string_append_printf(str, "  attributes: 0x%x [%s]\n", (guint) fu_struct_efi_vss_auth_variable_header_get_attributes(st), tmp);
3475
0
        } else {
3476
0
            g_string_append_printf(str, "  attributes: 0x%x\n", (guint) fu_struct_efi_vss_auth_variable_header_get_attributes(st));
3477
0
        }
3478
0
    }
3479
0
    g_string_append_printf(str, "  monotonic_counter: 0x%x\n",
3480
0
                           (guint) fu_struct_efi_vss_auth_variable_header_get_monotonic_counter(st));
3481
0
    {
3482
0
        g_autoptr(GByteArray) st_tmp = fu_struct_efi_vss_auth_variable_header_get_timestamp(st);
3483
0
        g_autofree gchar *tmp = fu_struct_efi_time_to_string(st_tmp);
3484
0
        g_string_append_printf(str, "  timestamp: %s\n", tmp);
3485
0
    }
3486
0
    g_string_append_printf(str, "  pubkey_index: 0x%x\n",
3487
0
                           (guint) fu_struct_efi_vss_auth_variable_header_get_pubkey_index(st));
3488
0
    g_string_append_printf(str, "  name_size: 0x%x\n",
3489
0
                           (guint) fu_struct_efi_vss_auth_variable_header_get_name_size(st));
3490
0
    g_string_append_printf(str, "  data_size: 0x%x\n",
3491
0
                           (guint) fu_struct_efi_vss_auth_variable_header_get_data_size(st));
3492
0
    {
3493
0
        g_autofree gchar *tmp = fwupd_guid_to_string(fu_struct_efi_vss_auth_variable_header_get_vendor_guid(st), FWUPD_GUID_FLAG_MIXED_ENDIAN);
3494
0
        g_string_append_printf(str, "  vendor_guid: %s\n", tmp);
3495
0
    }
3496
0
    if (str->len > 0)
3497
0
        g_string_set_size(str, str->len - 1);
3498
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3499
0
}
3500
static gboolean
3501
fu_struct_efi_vss_auth_variable_header_validate_internal(FuStructEfiVssAuthVariableHeader *st, GError **error)
3502
2.38k
{
3503
2.38k
    g_return_val_if_fail(st != NULL, FALSE);
3504
2.38k
    {
3505
2.38k
        GByteArray st_tmp = {
3506
2.38k
            .data = (guint8*) st->data + 0x10,
3507
2.38k
            .len = 16,
3508
2.38k
        };
3509
2.38k
        if (!fu_struct_efi_time_validate_internal(&st_tmp, error))
3510
0
            return FALSE;
3511
2.38k
    }
3512
2.38k
    return TRUE;
3513
2.38k
}
3514
static gboolean
3515
fu_struct_efi_vss_auth_variable_header_parse_internal(FuStructEfiVssAuthVariableHeader *st, GError **error)
3516
2.38k
{
3517
2.38k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
3518
0
        g_autofree gchar *str = fu_struct_efi_vss_auth_variable_header_to_string(st);
3519
0
        g_debug("%s", str);
3520
0
    }
3521
2.38k
    if (!fu_struct_efi_vss_auth_variable_header_validate_internal(st, error))
3522
0
        return FALSE;
3523
2.38k
    return TRUE;
3524
2.38k
}
3525
/**
3526
 * fu_struct_efi_vss_auth_variable_header_parse_stream: (skip):
3527
 **/
3528
FuStructEfiVssAuthVariableHeader *
3529
fu_struct_efi_vss_auth_variable_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
3530
2.43k
{
3531
2.43k
    g_autoptr(GByteArray) st = NULL;
3532
2.43k
    st = fu_input_stream_read_byte_array(stream, offset, 60, NULL, error);
3533
2.43k
    if (st == NULL) {
3534
0
        g_prefix_error(error, "FuStructEfiVssAuthVariableHeader failed read of 0x%x: ", (guint) 60);
3535
0
        return NULL;
3536
0
    }
3537
2.43k
    if (st->len != 60) {
3538
52
        g_set_error(error,
3539
52
                    FWUPD_ERROR,
3540
52
                    FWUPD_ERROR_INVALID_DATA,
3541
52
                    "FuStructEfiVssAuthVariableHeader requested 0x%x and got 0x%x",
3542
52
                    (guint) 60,
3543
52
                    (guint) st->len);
3544
52
        return NULL;
3545
52
    }
3546
2.38k
    if (!fu_struct_efi_vss_auth_variable_header_parse_internal(st, error))
3547
0
        return NULL;
3548
2.38k
    return g_steal_pointer(&st);
3549
2.38k
}
3550
/* getters */
3551
/**
3552
 * fu_struct_efi_fault_tolerant_working_block_header64_get_signature: (skip):
3553
 **/
3554
static const fwupd_guid_t *
3555
fu_struct_efi_fault_tolerant_working_block_header64_get_signature(const FuStructEfiFaultTolerantWorkingBlockHeader64 *st)
3556
27.0k
{
3557
27.0k
    g_return_val_if_fail(st != NULL, NULL);
3558
27.0k
    return (const fwupd_guid_t *) (st->data + 0);
3559
27.0k
}
3560
/**
3561
 * fu_struct_efi_fault_tolerant_working_block_header64_get_crc: (skip):
3562
 **/
3563
guint32
3564
fu_struct_efi_fault_tolerant_working_block_header64_get_crc(const FuStructEfiFaultTolerantWorkingBlockHeader64 *st)
3565
0
{
3566
0
    g_return_val_if_fail(st != NULL, 0x0);
3567
0
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
3568
0
}
3569
/**
3570
 * fu_struct_efi_fault_tolerant_working_block_header64_get_state: (skip):
3571
 **/
3572
FuEfiVariableStoreState
3573
fu_struct_efi_fault_tolerant_working_block_header64_get_state(const FuStructEfiFaultTolerantWorkingBlockHeader64 *st)
3574
120
{
3575
120
    g_return_val_if_fail(st != NULL, 0x0);
3576
120
    return st->data[20];
3577
120
}
3578
/**
3579
 * fu_struct_efi_fault_tolerant_working_block_header64_get_write_queue_size: (skip):
3580
 **/
3581
guint64
3582
fu_struct_efi_fault_tolerant_working_block_header64_get_write_queue_size(const FuStructEfiFaultTolerantWorkingBlockHeader64 *st)
3583
658
{
3584
658
    g_return_val_if_fail(st != NULL, 0x0);
3585
658
    return fu_memread_uint64(st->data + 24, G_LITTLE_ENDIAN);
3586
658
}
3587
3588
/* setters */
3589
/**
3590
 * fu_struct_efi_fault_tolerant_working_block_header64_set_signature: (skip):
3591
 **/
3592
static void
3593
fu_struct_efi_fault_tolerant_working_block_header64_set_signature(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, const fwupd_guid_t *value)
3594
93
{
3595
93
    g_return_if_fail(st != NULL);
3596
93
    g_return_if_fail(value != NULL);
3597
93
    memcpy(st->data + 0, value, sizeof(*value)); /* nocheck:blocked */
3598
93
}
3599
/**
3600
 * fu_struct_efi_fault_tolerant_working_block_header64_set_crc: (skip):
3601
 **/
3602
void
3603
fu_struct_efi_fault_tolerant_working_block_header64_set_crc(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, guint32 value)
3604
186
{
3605
186
    g_return_if_fail(st != NULL);
3606
186
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
3607
186
}
3608
/**
3609
 * fu_struct_efi_fault_tolerant_working_block_header64_set_state: (skip):
3610
 **/
3611
void
3612
fu_struct_efi_fault_tolerant_working_block_header64_set_state(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, FuEfiVariableStoreState value)
3613
186
{
3614
186
    g_return_if_fail(st != NULL);
3615
186
    st->data[20] = value;
3616
186
}
3617
/**
3618
 * fu_struct_efi_fault_tolerant_working_block_header64_set_write_queue_size: (skip):
3619
 **/
3620
void
3621
fu_struct_efi_fault_tolerant_working_block_header64_set_write_queue_size(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, guint64 value)
3622
93
{
3623
93
    g_return_if_fail(st != NULL);
3624
93
    fu_memwrite_uint64(st->data + 24, value, G_LITTLE_ENDIAN);
3625
93
}
3626
/**
3627
 * fu_struct_efi_fault_tolerant_working_block_header64_new: (skip):
3628
 **/
3629
FuStructEfiFaultTolerantWorkingBlockHeader64 *
3630
fu_struct_efi_fault_tolerant_working_block_header64_new(void)
3631
93
{
3632
93
    FuStructEfiFaultTolerantWorkingBlockHeader64 *st = g_byte_array_sized_new(32);
3633
93
    fu_byte_array_set_size(st, 32, 0x0);
3634
93
    fu_struct_efi_fault_tolerant_working_block_header64_set_signature(st, (fwupd_guid_t *) "\x2b\x29\x58\x9e\x68\x7c\x7d\x49\xa0\xce\x65\x0\xfd\x9f\x1b\x95");
3635
93
    fu_struct_efi_fault_tolerant_working_block_header64_set_crc(st, 0xFFFFFFFF);
3636
93
    fu_struct_efi_fault_tolerant_working_block_header64_set_state(st, FU_EFI_VARIABLE_STORE_STATE_EMPTY);
3637
93
    memcpy(st->data + 0x15, "\xFF\xFF\xFF", 3); /* nocheck:blocked */
3638
93
    return st;
3639
93
}
3640
/**
3641
 * fu_struct_efi_fault_tolerant_working_block_header64_to_string: (skip):
3642
 **/
3643
static gchar *
3644
fu_struct_efi_fault_tolerant_working_block_header64_to_string(const FuStructEfiFaultTolerantWorkingBlockHeader64 *st)
3645
0
{
3646
0
    g_autoptr(GString) str = g_string_new("FuStructEfiFaultTolerantWorkingBlockHeader64:\n");
3647
0
    g_return_val_if_fail(st != NULL, NULL);
3648
0
    g_string_append_printf(str, "  crc: 0x%x\n",
3649
0
                           (guint) fu_struct_efi_fault_tolerant_working_block_header64_get_crc(st));
3650
0
    {
3651
0
        const gchar *tmp = fu_efi_variable_store_state_to_string(fu_struct_efi_fault_tolerant_working_block_header64_get_state(st));
3652
0
        if (tmp != NULL) {
3653
0
            g_string_append_printf(str, "  state: 0x%x [%s]\n", (guint) fu_struct_efi_fault_tolerant_working_block_header64_get_state(st), tmp);
3654
0
        } else {
3655
0
            g_string_append_printf(str, "  state: 0x%x\n", (guint) fu_struct_efi_fault_tolerant_working_block_header64_get_state(st));
3656
0
        }
3657
0
    }
3658
0
    g_string_append_printf(str, "  write_queue_size: 0x%x\n",
3659
0
                           (guint) fu_struct_efi_fault_tolerant_working_block_header64_get_write_queue_size(st));
3660
0
    if (str->len > 0)
3661
0
        g_string_set_size(str, str->len - 1);
3662
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3663
0
}
3664
static gboolean
3665
fu_struct_efi_fault_tolerant_working_block_header64_validate_internal(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, GError **error)
3666
27.0k
{
3667
27.0k
    g_return_val_if_fail(st != NULL, FALSE);
3668
27.0k
    if (memcmp(fu_struct_efi_fault_tolerant_working_block_header64_get_signature(st), "\x2b\x29\x58\x9e\x68\x7c\x7d\x49\xa0\xce\x65\x0\xfd\x9f\x1b\x95", 16) != 0) {
3669
26.0k
        g_set_error_literal(error,
3670
26.0k
                            FWUPD_ERROR,
3671
26.0k
                            FWUPD_ERROR_INVALID_DATA,
3672
26.0k
                            "constant FuStructEfiFaultTolerantWorkingBlockHeader64.signature was not valid");
3673
26.0k
        return FALSE;
3674
26.0k
    }
3675
1.03k
    return TRUE;
3676
27.0k
}
3677
/**
3678
 * fu_struct_efi_fault_tolerant_working_block_header64_validate_stream: (skip):
3679
 **/
3680
gboolean
3681
fu_struct_efi_fault_tolerant_working_block_header64_validate_stream(GInputStream *stream, gsize offset, GError **error)
3682
26.8k
{
3683
26.8k
    g_autoptr(GByteArray) st = NULL;
3684
26.8k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
3685
26.8k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
3686
26.8k
    st = fu_input_stream_read_byte_array(stream, offset, 32, NULL, error);
3687
26.8k
    if (st == NULL) {
3688
0
        g_prefix_error(error, "FuStructEfiFaultTolerantWorkingBlockHeader64 failed read of 0x%x: ", (guint) 32);
3689
0
        return FALSE;
3690
0
    }
3691
26.8k
    if (st->len != 32) {
3692
135
        g_set_error(error,
3693
135
                    FWUPD_ERROR,
3694
135
                    FWUPD_ERROR_INVALID_DATA,
3695
135
                    "FuStructEfiFaultTolerantWorkingBlockHeader64 requested 0x%x and got 0x%x",
3696
135
                    (guint) 32,
3697
135
                    (guint) st->len);
3698
135
        return FALSE;
3699
135
    }
3700
26.7k
    return fu_struct_efi_fault_tolerant_working_block_header64_validate_internal(st, error);
3701
26.8k
}
3702
static gboolean
3703
fu_struct_efi_fault_tolerant_working_block_header64_parse_internal(FuStructEfiFaultTolerantWorkingBlockHeader64 *st, GError **error)
3704
329
{
3705
329
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
3706
0
        g_autofree gchar *str = fu_struct_efi_fault_tolerant_working_block_header64_to_string(st);
3707
0
        g_debug("%s", str);
3708
0
    }
3709
329
    if (!fu_struct_efi_fault_tolerant_working_block_header64_validate_internal(st, error))
3710
0
        return FALSE;
3711
329
    return TRUE;
3712
329
}
3713
/**
3714
 * fu_struct_efi_fault_tolerant_working_block_header64_parse_stream: (skip):
3715
 **/
3716
FuStructEfiFaultTolerantWorkingBlockHeader64 *
3717
fu_struct_efi_fault_tolerant_working_block_header64_parse_stream(GInputStream *stream, gsize offset, GError **error)
3718
329
{
3719
329
    g_autoptr(GByteArray) st = NULL;
3720
329
    st = fu_input_stream_read_byte_array(stream, offset, 32, NULL, error);
3721
329
    if (st == NULL) {
3722
0
        g_prefix_error(error, "FuStructEfiFaultTolerantWorkingBlockHeader64 failed read of 0x%x: ", (guint) 32);
3723
0
        return NULL;
3724
0
    }
3725
329
    if (st->len != 32) {
3726
0
        g_set_error(error,
3727
0
                    FWUPD_ERROR,
3728
0
                    FWUPD_ERROR_INVALID_DATA,
3729
0
                    "FuStructEfiFaultTolerantWorkingBlockHeader64 requested 0x%x and got 0x%x",
3730
0
                    (guint) 32,
3731
0
                    (guint) st->len);
3732
0
        return NULL;
3733
0
    }
3734
329
    if (!fu_struct_efi_fault_tolerant_working_block_header64_parse_internal(st, error))
3735
0
        return NULL;
3736
329
    return g_steal_pointer(&st);
3737
329
}
3738
/* getters */
3739
/**
3740
 * fu_struct_shim_hive_get_magic: (skip):
3741
 **/
3742
static gchar *
3743
fu_struct_shim_hive_get_magic(const FuStructShimHive *st)
3744
431
{
3745
431
    g_return_val_if_fail(st != NULL, NULL);
3746
431
    return fu_memstrsafe(st->data, st->len, 0, 4, NULL);
3747
431
}
3748
/**
3749
 * fu_struct_shim_hive_get_header_version: (skip):
3750
 **/
3751
guint8
3752
fu_struct_shim_hive_get_header_version(const FuStructShimHive *st)
3753
903
{
3754
903
    g_return_val_if_fail(st != NULL, 0x0);
3755
903
    return st->data[4];
3756
903
}
3757
/**
3758
 * fu_struct_shim_hive_get_items_count: (skip):
3759
 **/
3760
guint8
3761
fu_struct_shim_hive_get_items_count(const FuStructShimHive *st)
3762
901
{
3763
901
    g_return_val_if_fail(st != NULL, 0x0);
3764
901
    return st->data[5];
3765
901
}
3766
/**
3767
 * fu_struct_shim_hive_get_items_offset: (skip):
3768
 **/
3769
guint8
3770
fu_struct_shim_hive_get_items_offset(const FuStructShimHive *st)
3771
901
{
3772
901
    g_return_val_if_fail(st != NULL, 0x0);
3773
901
    return st->data[6];
3774
901
}
3775
/**
3776
 * fu_struct_shim_hive_get_crc32: (skip):
3777
 **/
3778
guint32
3779
fu_struct_shim_hive_get_crc32(const FuStructShimHive *st)
3780
0
{
3781
0
    g_return_val_if_fail(st != NULL, 0x0);
3782
0
    return fu_memread_uint32(st->data + 7, G_LITTLE_ENDIAN);
3783
0
}
3784
3785
/* setters */
3786
/**
3787
 * fu_struct_shim_hive_set_magic: (skip):
3788
 **/
3789
static gboolean
3790
fu_struct_shim_hive_set_magic(FuStructShimHive *st, const gchar *value, GError **error)
3791
372
{
3792
372
    gsize len;
3793
372
    g_return_val_if_fail(st != NULL, FALSE);
3794
372
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
3795
372
    if (value == NULL) {
3796
0
        memset(st->data + 0, 0x0, 4);
3797
0
        return TRUE;
3798
0
    }
3799
372
    len = strlen(value);
3800
372
    if (len > 4) {
3801
0
        g_set_error(error,
3802
0
                    FWUPD_ERROR,
3803
0
                    FWUPD_ERROR_INVALID_DATA,
3804
0
                    "string '%s' (0x%x bytes) does not fit in FuStructShimHive.magic (0x%x bytes)",
3805
0
                    value, (guint) len, (guint) 4);
3806
0
        return FALSE;
3807
0
    }
3808
372
    return fu_memcpy_safe(st->data, st->len, 0, (const guint8 *)value, len, 0x0, len, error);
3809
372
}
3810
/**
3811
 * fu_struct_shim_hive_set_header_version: (skip):
3812
 **/
3813
void
3814
fu_struct_shim_hive_set_header_version(FuStructShimHive *st, guint8 value)
3815
372
{
3816
372
    g_return_if_fail(st != NULL);
3817
372
    st->data[4] = value;
3818
372
}
3819
/**
3820
 * fu_struct_shim_hive_set_items_count: (skip):
3821
 **/
3822
void
3823
fu_struct_shim_hive_set_items_count(FuStructShimHive *st, guint8 value)
3824
372
{
3825
372
    g_return_if_fail(st != NULL);
3826
372
    st->data[5] = value;
3827
372
}
3828
/**
3829
 * fu_struct_shim_hive_set_items_offset: (skip):
3830
 **/
3831
void
3832
fu_struct_shim_hive_set_items_offset(FuStructShimHive *st, guint8 value)
3833
372
{
3834
372
    g_return_if_fail(st != NULL);
3835
372
    st->data[6] = value;
3836
372
}
3837
/**
3838
 * fu_struct_shim_hive_set_crc32: (skip):
3839
 **/
3840
void
3841
fu_struct_shim_hive_set_crc32(FuStructShimHive *st, guint32 value)
3842
372
{
3843
372
    g_return_if_fail(st != NULL);
3844
372
    fu_memwrite_uint32(st->data + 7, value, G_LITTLE_ENDIAN);
3845
372
}
3846
/**
3847
 * fu_struct_shim_hive_new: (skip):
3848
 **/
3849
FuStructShimHive *
3850
fu_struct_shim_hive_new(void)
3851
372
{
3852
372
    FuStructShimHive *st = g_byte_array_sized_new(11);
3853
372
    fu_byte_array_set_size(st, 11, 0x0);
3854
372
    fu_struct_shim_hive_set_magic(st, "HIVE", NULL);
3855
372
    fu_struct_shim_hive_set_header_version(st, 0x1);
3856
372
    return st;
3857
372
}
3858
/**
3859
 * fu_struct_shim_hive_to_string: (skip):
3860
 **/
3861
static gchar *
3862
fu_struct_shim_hive_to_string(const FuStructShimHive *st)
3863
0
{
3864
0
    g_autoptr(GString) str = g_string_new("FuStructShimHive:\n");
3865
0
    g_return_val_if_fail(st != NULL, NULL);
3866
0
    g_string_append_printf(str, "  header_version: 0x%x\n",
3867
0
                           (guint) fu_struct_shim_hive_get_header_version(st));
3868
0
    g_string_append_printf(str, "  items_count: 0x%x\n",
3869
0
                           (guint) fu_struct_shim_hive_get_items_count(st));
3870
0
    g_string_append_printf(str, "  items_offset: 0x%x\n",
3871
0
                           (guint) fu_struct_shim_hive_get_items_offset(st));
3872
0
    g_string_append_printf(str, "  crc32: 0x%x\n",
3873
0
                           (guint) fu_struct_shim_hive_get_crc32(st));
3874
0
    if (str->len > 0)
3875
0
        g_string_set_size(str, str->len - 1);
3876
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3877
0
}
3878
static gboolean
3879
fu_struct_shim_hive_validate_internal(FuStructShimHive *st, GError **error)
3880
1.33k
{
3881
1.33k
    g_return_val_if_fail(st != NULL, FALSE);
3882
1.33k
    if (strncmp((const gchar *) (st->data + 0), "HIVE", 4) != 0) {
3883
431
        g_autofree gchar *str = fu_struct_shim_hive_get_magic(st);
3884
431
        g_set_error(error,
3885
431
                    FWUPD_ERROR,
3886
431
                    FWUPD_ERROR_INVALID_DATA,
3887
431
                    "constant FuStructShimHive.magic was not valid, "
3888
431
                    "expected 'HIVE' and got '%s'",
3889
431
                    str);
3890
431
        return FALSE;
3891
431
    }
3892
902
    return TRUE;
3893
1.33k
}
3894
static gboolean
3895
fu_struct_shim_hive_parse_internal(FuStructShimHive *st, GError **error)
3896
1.33k
{
3897
1.33k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
3898
0
        g_autofree gchar *str = fu_struct_shim_hive_to_string(st);
3899
0
        g_debug("%s", str);
3900
0
    }
3901
1.33k
    if (!fu_struct_shim_hive_validate_internal(st, error))
3902
431
        return FALSE;
3903
902
    return TRUE;
3904
1.33k
}
3905
/**
3906
 * fu_struct_shim_hive_parse_stream: (skip):
3907
 **/
3908
FuStructShimHive *
3909
fu_struct_shim_hive_parse_stream(GInputStream *stream, gsize offset, GError **error)
3910
1.41k
{
3911
1.41k
    g_autoptr(GByteArray) st = NULL;
3912
1.41k
    st = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
3913
1.41k
    if (st == NULL) {
3914
0
        g_prefix_error(error, "FuStructShimHive failed read of 0x%x: ", (guint) 11);
3915
0
        return NULL;
3916
0
    }
3917
1.41k
    if (st->len != 11) {
3918
83
        g_set_error(error,
3919
83
                    FWUPD_ERROR,
3920
83
                    FWUPD_ERROR_INVALID_DATA,
3921
83
                    "FuStructShimHive requested 0x%x and got 0x%x",
3922
83
                    (guint) 11,
3923
83
                    (guint) st->len);
3924
83
        return NULL;
3925
83
    }
3926
1.33k
    if (!fu_struct_shim_hive_parse_internal(st, error))
3927
431
        return NULL;
3928
902
    return g_steal_pointer(&st);
3929
1.33k
}
3930
/* getters */
3931
/**
3932
 * fu_struct_shim_hive_item_get_key_length: (skip):
3933
 **/
3934
guint8
3935
fu_struct_shim_hive_item_get_key_length(const FuStructShimHiveItem *st)
3936
4.95k
{
3937
4.95k
    g_return_val_if_fail(st != NULL, 0x0);
3938
4.95k
    return st->data[0];
3939
4.95k
}
3940
/**
3941
 * fu_struct_shim_hive_item_get_value_length: (skip):
3942
 **/
3943
guint32
3944
fu_struct_shim_hive_item_get_value_length(const FuStructShimHiveItem *st)
3945
4.81k
{
3946
4.81k
    g_return_val_if_fail(st != NULL, 0x0);
3947
4.81k
    return fu_memread_uint32(st->data + 1, G_LITTLE_ENDIAN);
3948
4.81k
}
3949
3950
/* setters */
3951
/**
3952
 * fu_struct_shim_hive_item_set_key_length: (skip):
3953
 **/
3954
void
3955
fu_struct_shim_hive_item_set_key_length(FuStructShimHiveItem *st, guint8 value)
3956
1.10k
{
3957
1.10k
    g_return_if_fail(st != NULL);
3958
1.10k
    st->data[0] = value;
3959
1.10k
}
3960
/**
3961
 * fu_struct_shim_hive_item_set_value_length: (skip):
3962
 **/
3963
void
3964
fu_struct_shim_hive_item_set_value_length(FuStructShimHiveItem *st, guint32 value)
3965
1.10k
{
3966
1.10k
    g_return_if_fail(st != NULL);
3967
1.10k
    fu_memwrite_uint32(st->data + 1, value, G_LITTLE_ENDIAN);
3968
1.10k
}
3969
/**
3970
 * fu_struct_shim_hive_item_new: (skip):
3971
 **/
3972
FuStructShimHiveItem *
3973
fu_struct_shim_hive_item_new(void)
3974
1.10k
{
3975
1.10k
    FuStructShimHiveItem *st = g_byte_array_sized_new(5);
3976
1.10k
    fu_byte_array_set_size(st, 5, 0x0);
3977
1.10k
    return st;
3978
1.10k
}
3979
/**
3980
 * fu_struct_shim_hive_item_to_string: (skip):
3981
 **/
3982
static gchar *
3983
fu_struct_shim_hive_item_to_string(const FuStructShimHiveItem *st)
3984
0
{
3985
0
    g_autoptr(GString) str = g_string_new("FuStructShimHiveItem:\n");
3986
0
    g_return_val_if_fail(st != NULL, NULL);
3987
0
    g_string_append_printf(str, "  key_length: 0x%x\n",
3988
0
                           (guint) fu_struct_shim_hive_item_get_key_length(st));
3989
0
    g_string_append_printf(str, "  value_length: 0x%x\n",
3990
0
                           (guint) fu_struct_shim_hive_item_get_value_length(st));
3991
0
    if (str->len > 0)
3992
0
        g_string_set_size(str, str->len - 1);
3993
0
    return g_string_free(g_steal_pointer(&str), FALSE);
3994
0
}
3995
static gboolean
3996
fu_struct_shim_hive_item_validate_internal(FuStructShimHiveItem *st, GError **error)
3997
4.95k
{
3998
4.95k
    g_return_val_if_fail(st != NULL, FALSE);
3999
4.95k
    return TRUE;
4000
4.95k
}
4001
static gboolean
4002
fu_struct_shim_hive_item_parse_internal(FuStructShimHiveItem *st, GError **error)
4003
4.95k
{
4004
4.95k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
4005
0
        g_autofree gchar *str = fu_struct_shim_hive_item_to_string(st);
4006
0
        g_debug("%s", str);
4007
0
    }
4008
4.95k
    if (!fu_struct_shim_hive_item_validate_internal(st, error))
4009
0
        return FALSE;
4010
4.95k
    return TRUE;
4011
4.95k
}
4012
/**
4013
 * fu_struct_shim_hive_item_parse_stream: (skip):
4014
 **/
4015
FuStructShimHiveItem *
4016
fu_struct_shim_hive_item_parse_stream(GInputStream *stream, gsize offset, GError **error)
4017
5.22k
{
4018
5.22k
    g_autoptr(GByteArray) st = NULL;
4019
5.22k
    st = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
4020
5.22k
    if (st == NULL) {
4021
147
        g_prefix_error(error, "FuStructShimHiveItem failed read of 0x%x: ", (guint) 5);
4022
147
        return NULL;
4023
147
    }
4024
5.08k
    if (st->len != 5) {
4025
123
        g_set_error(error,
4026
123
                    FWUPD_ERROR,
4027
123
                    FWUPD_ERROR_INVALID_DATA,
4028
123
                    "FuStructShimHiveItem requested 0x%x and got 0x%x",
4029
123
                    (guint) 5,
4030
123
                    (guint) st->len);
4031
123
        return NULL;
4032
123
    }
4033
4.95k
    if (!fu_struct_shim_hive_item_parse_internal(st, error))
4034
0
        return NULL;
4035
4.95k
    return g_steal_pointer(&st);
4036
4.95k
}