master
h 202 lines 7.66 KB
Raw
1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 *
4 * uefi-vars device - state struct and function prototypes
5 */
6 #ifndef QEMU_UEFI_VAR_SERVICE_H
7 #define QEMU_UEFI_VAR_SERVICE_H
8
9 #include "qemu/uuid.h"
10 #include "qemu/queue.h"
11
12 #include "system/memory.h"
13 #include "hw/uefi/var-service-edk2.h"
14
15 #define MAX_BUFFER_SIZE (64 * 1024)
16
17 typedef struct uefi_variable uefi_variable;
18 typedef struct uefi_var_policy uefi_var_policy;
19 typedef struct uefi_vars_state uefi_vars_state;
20
21 typedef struct uefi_vars_cert uefi_vars_cert;
22 typedef struct uefi_vars_hash uefi_vars_hash;
23 typedef struct uefi_vars_siglist uefi_vars_siglist;
24
25 struct uefi_variable {
26 QemuUUID guid;
27 uint16_t *name;
28 uint32_t name_size;
29 uint32_t attributes;
30 void *data;
31 uint32_t data_size;
32 efi_time time;
33 void *digest;
34 uint32_t digest_size;
35 QTAILQ_ENTRY(uefi_variable) next;
36 };
37
38 struct uefi_var_policy {
39 variable_policy_entry *entry;
40 uint32_t entry_size;
41 uint16_t *name;
42 uint32_t name_size;
43
44 /* number of hashmarks (wildcard character) in name */
45 uint32_t hashmarks;
46
47 QTAILQ_ENTRY(uefi_var_policy) next;
48 };
49
50 struct uefi_vars_state {
51 MemoryRegion mr;
52 uint16_t sts;
53 uint32_t buf_size;
54 uint32_t buf_addr_lo;
55 uint32_t buf_addr_hi;
56 uint8_t *buffer;
57 QTAILQ_HEAD(, uefi_variable) variables;
58 QTAILQ_HEAD(, uefi_var_policy) var_policies;
59
60 /* pio transfer buffer */
61 uint32_t pio_xfer_offset;
62 uint8_t *pio_xfer_buffer;
63
64 /* boot phases */
65 bool end_of_dxe;
66 bool ready_to_boot;
67 bool exit_boot_service;
68 bool policy_locked;
69
70 /* storage accounting */
71 uint64_t max_storage;
72 uint64_t used_storage;
73
74 /* config options */
75 char *jsonfile;
76 int jsonfd;
77 bool force_secure_boot;
78 bool disable_custom_mode;
79 bool use_pio;
80
81 /* request + reply capture */
82 char *pcapfile;
83 FILE *pcapfp;
84 };
85
86 struct uefi_vars_cert {
87 QTAILQ_ENTRY(uefi_vars_cert) next;
88 QemuUUID owner;
89 uint64_t size;
90 uint8_t data[];
91 };
92
93 struct uefi_vars_hash {
94 QTAILQ_ENTRY(uefi_vars_hash) next;
95 QemuUUID owner;
96 uint8_t data[];
97 };
98
99 struct uefi_vars_siglist {
100 QTAILQ_HEAD(, uefi_vars_cert) x509;
101 QTAILQ_HEAD(, uefi_vars_hash) sha256;
102 };
103
104 /* vars-service-guid.c */
105 extern const QemuUUID EfiGlobalVariable;
106 extern const QemuUUID EfiImageSecurityDatabase;
107 extern const QemuUUID EfiCustomModeEnable;
108 extern const QemuUUID EfiSecureBootEnableDisable;
109
110 extern const QemuUUID EfiCertSha256Guid;
111 extern const QemuUUID EfiCertSha384Guid;
112 extern const QemuUUID EfiCertSha512Guid;
113 extern const QemuUUID EfiCertRsa2048Guid;
114 extern const QemuUUID EfiCertX509Guid;
115 extern const QemuUUID EfiCertTypePkcs7Guid;
116
117 extern const QemuUUID EfiSmmVariableProtocolGuid;
118 extern const QemuUUID VarCheckPolicyLibMmiHandlerGuid;
119
120 extern const QemuUUID EfiEndOfDxeEventGroupGuid;
121 extern const QemuUUID EfiEventReadyToBootGuid;
122 extern const QemuUUID EfiEventExitBootServicesGuid;
123
124 /* vars-service-utils.c */
125 gboolean uefi_str_is_valid(const uint16_t *str, size_t len,
126 gboolean must_be_null_terminated);
127 size_t uefi_strlen(const uint16_t *str, size_t len);
128 gboolean uefi_str_equal_ex(const uint16_t *a, size_t alen,
129 const uint16_t *b, size_t blen,
130 gboolean wildcards_in_a);
131 gboolean uefi_str_equal(const uint16_t *a, size_t alen,
132 const uint16_t *b, size_t blen);
133 char *uefi_ucs2_to_ascii(const uint16_t *ucs2, uint64_t ucs2_size);
134 int uefi_time_compare(efi_time *a, efi_time *b);
135 void uefi_trace_variable(const char *action, QemuUUID guid,
136 const uint16_t *name, uint64_t name_size);
137 void uefi_trace_status(const char *action, efi_status status);
138
139 /* vars-service-core.c */
140 extern const VMStateDescription vmstate_uefi_vars;
141 void uefi_vars_init(Object *obj, uefi_vars_state *uv);
142 void uefi_vars_realize(uefi_vars_state *uv, Error **errp);
143 void uefi_vars_hard_reset(uefi_vars_state *uv);
144
145 /* vars-service-json.c */
146 void uefi_vars_json_init(uefi_vars_state *uv, Error **errp);
147 void uefi_vars_json_save(uefi_vars_state *uv);
148 void uefi_vars_json_load(uefi_vars_state *uv, Error **errp);
149
150 /* vars-service-vars.c */
151 extern const VMStateDescription vmstate_uefi_variable;
152 uefi_variable *uefi_vars_find_variable(uefi_vars_state *uv, QemuUUID guid,
153 const uint16_t *name,
154 uint64_t name_size);
155 void uefi_vars_set_variable(uefi_vars_state *uv, QemuUUID guid,
156 const uint16_t *name, uint64_t name_size,
157 uint32_t attributes,
158 void *data, uint64_t data_size);
159 void uefi_vars_clear_volatile(uefi_vars_state *uv);
160 void uefi_vars_clear_all(uefi_vars_state *uv);
161 void uefi_vars_update_storage(uefi_vars_state *uv);
162 uint32_t uefi_vars_mm_vars_proto(uefi_vars_state *uv);
163
164 /* vars-service-auth.c */
165 bool uefi_vars_is_sb_pk(uefi_variable *var);
166 bool uefi_vars_is_sb_any(uefi_variable *var);
167 efi_status uefi_vars_check_auth_2(uefi_vars_state *uv, uefi_variable *var,
168 mm_variable_access *va, void *data);
169 efi_status uefi_vars_check_secure_boot(uefi_vars_state *uv, uefi_variable *var);
170 void uefi_vars_auth_init(uefi_vars_state *uv);
171
172 /* vars-service-pkcs7.c */
173 efi_status uefi_vars_check_pkcs7_2(uefi_variable *siglist,
174 void **digest, uint32_t *digest_size,
175 mm_variable_access *va, void *data);
176
177 /* vars-service-siglist.c */
178 void uefi_vars_siglist_init(uefi_vars_siglist *siglist);
179 void uefi_vars_siglist_free(uefi_vars_siglist *siglist);
180 void uefi_vars_siglist_parse(uefi_vars_siglist *siglist,
181 void *data, uint64_t size);
182 uint64_t uefi_vars_siglist_blob_size(uefi_vars_siglist *siglist);
183 void uefi_vars_siglist_blob_generate(uefi_vars_siglist *siglist,
184 void *data, uint64_t size);
185
186 /* vars-service-policy.c */
187 extern const VMStateDescription vmstate_uefi_var_policy;
188 efi_status uefi_vars_policy_check(uefi_vars_state *uv,
189 uefi_variable *var,
190 gboolean is_newvar);
191 void uefi_vars_policies_clear(uefi_vars_state *uv);
192 uefi_var_policy *uefi_vars_add_policy(uefi_vars_state *uv,
193 variable_policy_entry *pe);
194 uint32_t uefi_vars_mm_check_policy_proto(uefi_vars_state *uv);
195
196 /* vars-service-pcap.c */
197 void uefi_vars_pcap_init(uefi_vars_state *uv, Error **errp);
198 void uefi_vars_pcap_reset(uefi_vars_state *uv);
199 void uefi_vars_pcap_request(uefi_vars_state *uv, void *buffer, size_t size);
200 void uefi_vars_pcap_reply(uefi_vars_state *uv, void *buffer, size_t size);
201
202 #endif /* QEMU_UEFI_VAR_SERVICE_H */