xref: /qemu/hw/uefi/var-service-auth.c (revision 50aa3d0984d8a4a9c39d34e2f81e8a70674462e4)
1*f1488facSGerd Hoffmann /*
2*f1488facSGerd Hoffmann  * SPDX-License-Identifier: GPL-2.0-or-later
3*f1488facSGerd Hoffmann  *
4*f1488facSGerd Hoffmann  * uefi vars device - AuthVariableLib
5*f1488facSGerd Hoffmann  */
6*f1488facSGerd Hoffmann 
7*f1488facSGerd Hoffmann #include "qemu/osdep.h"
8*f1488facSGerd Hoffmann #include "qemu/error-report.h"
9*f1488facSGerd Hoffmann #include "system/dma.h"
10*f1488facSGerd Hoffmann 
11*f1488facSGerd Hoffmann #include "hw/uefi/var-service.h"
12*f1488facSGerd Hoffmann 
13*f1488facSGerd Hoffmann static const uint16_t name_pk[]           = u"PK";
14*f1488facSGerd Hoffmann static const uint16_t name_kek[]          = u"KEK";
15*f1488facSGerd Hoffmann static const uint16_t name_db[]           = u"db";
16*f1488facSGerd Hoffmann static const uint16_t name_dbx[]          = u"dbx";
17*f1488facSGerd Hoffmann static const uint16_t name_setup_mode[]   = u"SetupMode";
18*f1488facSGerd Hoffmann static const uint16_t name_sigs_support[] = u"SignatureSupport";
19*f1488facSGerd Hoffmann static const uint16_t name_sb[]           = u"SecureBoot";
20*f1488facSGerd Hoffmann static const uint16_t name_sb_enable[]    = u"SecureBootEnable";
21*f1488facSGerd Hoffmann static const uint16_t name_custom_mode[]  = u"CustomMode";
22*f1488facSGerd Hoffmann static const uint16_t name_vk[]           = u"VendorKeys";
23*f1488facSGerd Hoffmann static const uint16_t name_vk_nv[]        = u"VendorKeysNv";
24*f1488facSGerd Hoffmann 
25*f1488facSGerd Hoffmann static const uint32_t sigdb_attrs =
26*f1488facSGerd Hoffmann     EFI_VARIABLE_NON_VOLATILE |
27*f1488facSGerd Hoffmann     EFI_VARIABLE_BOOTSERVICE_ACCESS |
28*f1488facSGerd Hoffmann     EFI_VARIABLE_RUNTIME_ACCESS |
29*f1488facSGerd Hoffmann     EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
30*f1488facSGerd Hoffmann 
set_secure_boot(uefi_vars_state * uv,uint8_t sb)31*f1488facSGerd Hoffmann static void set_secure_boot(uefi_vars_state *uv, uint8_t sb)
32*f1488facSGerd Hoffmann {
33*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiGlobalVariable,
34*f1488facSGerd Hoffmann                            name_sb, sizeof(name_sb),
35*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS |
36*f1488facSGerd Hoffmann                            EFI_VARIABLE_RUNTIME_ACCESS,
37*f1488facSGerd Hoffmann                            &sb, sizeof(sb));
38*f1488facSGerd Hoffmann }
39*f1488facSGerd Hoffmann 
set_secure_boot_enable(uefi_vars_state * uv,uint8_t sbe)40*f1488facSGerd Hoffmann static void set_secure_boot_enable(uefi_vars_state *uv, uint8_t sbe)
41*f1488facSGerd Hoffmann {
42*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiSecureBootEnableDisable,
43*f1488facSGerd Hoffmann                            name_sb_enable, sizeof(name_sb_enable),
44*f1488facSGerd Hoffmann                            EFI_VARIABLE_NON_VOLATILE |
45*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS,
46*f1488facSGerd Hoffmann                            &sbe, sizeof(sbe));
47*f1488facSGerd Hoffmann }
48*f1488facSGerd Hoffmann 
set_setup_mode(uefi_vars_state * uv,uint8_t sm)49*f1488facSGerd Hoffmann static void set_setup_mode(uefi_vars_state *uv, uint8_t sm)
50*f1488facSGerd Hoffmann {
51*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiGlobalVariable,
52*f1488facSGerd Hoffmann                            name_setup_mode, sizeof(name_setup_mode),
53*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS |
54*f1488facSGerd Hoffmann                            EFI_VARIABLE_RUNTIME_ACCESS,
55*f1488facSGerd Hoffmann                            &sm, sizeof(sm));
56*f1488facSGerd Hoffmann }
57*f1488facSGerd Hoffmann 
set_custom_mode(uefi_vars_state * uv,uint8_t cm)58*f1488facSGerd Hoffmann static void set_custom_mode(uefi_vars_state *uv, uint8_t cm)
59*f1488facSGerd Hoffmann {
60*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiCustomModeEnable,
61*f1488facSGerd Hoffmann                            name_custom_mode, sizeof(name_custom_mode),
62*f1488facSGerd Hoffmann                            EFI_VARIABLE_NON_VOLATILE |
63*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS,
64*f1488facSGerd Hoffmann                            &cm, sizeof(cm));
65*f1488facSGerd Hoffmann }
66*f1488facSGerd Hoffmann 
set_signature_support(uefi_vars_state * uv)67*f1488facSGerd Hoffmann static void set_signature_support(uefi_vars_state *uv)
68*f1488facSGerd Hoffmann {
69*f1488facSGerd Hoffmann     QemuUUID sigs_support[5];
70*f1488facSGerd Hoffmann 
71*f1488facSGerd Hoffmann     sigs_support[0] = EfiCertSha256Guid;
72*f1488facSGerd Hoffmann     sigs_support[1] = EfiCertSha384Guid;
73*f1488facSGerd Hoffmann     sigs_support[2] = EfiCertSha512Guid;
74*f1488facSGerd Hoffmann     sigs_support[3] = EfiCertRsa2048Guid;
75*f1488facSGerd Hoffmann     sigs_support[4] = EfiCertX509Guid;
76*f1488facSGerd Hoffmann 
77*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiGlobalVariable,
78*f1488facSGerd Hoffmann                            name_sigs_support, sizeof(name_sigs_support),
79*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS |
80*f1488facSGerd Hoffmann                            EFI_VARIABLE_RUNTIME_ACCESS,
81*f1488facSGerd Hoffmann                            sigs_support, sizeof(sigs_support));
82*f1488facSGerd Hoffmann }
83*f1488facSGerd Hoffmann 
setup_mode_is_active(uefi_vars_state * uv)84*f1488facSGerd Hoffmann static bool setup_mode_is_active(uefi_vars_state *uv)
85*f1488facSGerd Hoffmann {
86*f1488facSGerd Hoffmann     uefi_variable *var;
87*f1488facSGerd Hoffmann     uint8_t *value;
88*f1488facSGerd Hoffmann 
89*f1488facSGerd Hoffmann     var = uefi_vars_find_variable(uv, EfiGlobalVariable,
90*f1488facSGerd Hoffmann                                   name_setup_mode, sizeof(name_setup_mode));
91*f1488facSGerd Hoffmann     if (var) {
92*f1488facSGerd Hoffmann         value = var->data;
93*f1488facSGerd Hoffmann         if (value[0] == SETUP_MODE) {
94*f1488facSGerd Hoffmann             return true;
95*f1488facSGerd Hoffmann         }
96*f1488facSGerd Hoffmann     }
97*f1488facSGerd Hoffmann     return false;
98*f1488facSGerd Hoffmann }
99*f1488facSGerd Hoffmann 
custom_mode_is_active(uefi_vars_state * uv)100*f1488facSGerd Hoffmann static bool custom_mode_is_active(uefi_vars_state *uv)
101*f1488facSGerd Hoffmann {
102*f1488facSGerd Hoffmann     uefi_variable *var;
103*f1488facSGerd Hoffmann     uint8_t *value;
104*f1488facSGerd Hoffmann 
105*f1488facSGerd Hoffmann     var = uefi_vars_find_variable(uv, EfiCustomModeEnable,
106*f1488facSGerd Hoffmann                                   name_custom_mode, sizeof(name_custom_mode));
107*f1488facSGerd Hoffmann     if (var) {
108*f1488facSGerd Hoffmann         value = var->data;
109*f1488facSGerd Hoffmann         if (value[0] == CUSTOM_SECURE_BOOT_MODE) {
110*f1488facSGerd Hoffmann             return true;
111*f1488facSGerd Hoffmann         }
112*f1488facSGerd Hoffmann     }
113*f1488facSGerd Hoffmann     return false;
114*f1488facSGerd Hoffmann }
115*f1488facSGerd Hoffmann 
uefi_vars_is_sb_pk(uefi_variable * var)116*f1488facSGerd Hoffmann bool uefi_vars_is_sb_pk(uefi_variable *var)
117*f1488facSGerd Hoffmann {
118*f1488facSGerd Hoffmann     if (qemu_uuid_is_equal(&var->guid, &EfiGlobalVariable) &&
119*f1488facSGerd Hoffmann         uefi_str_equal(var->name, var->name_size, name_pk, sizeof(name_pk))) {
120*f1488facSGerd Hoffmann         return true;
121*f1488facSGerd Hoffmann     }
122*f1488facSGerd Hoffmann     return false;
123*f1488facSGerd Hoffmann }
124*f1488facSGerd Hoffmann 
uefi_vars_is_sb_kek(uefi_variable * var)125*f1488facSGerd Hoffmann static bool uefi_vars_is_sb_kek(uefi_variable *var)
126*f1488facSGerd Hoffmann {
127*f1488facSGerd Hoffmann     if (qemu_uuid_is_equal(&var->guid, &EfiGlobalVariable) &&
128*f1488facSGerd Hoffmann         uefi_str_equal(var->name, var->name_size, name_kek, sizeof(name_kek))) {
129*f1488facSGerd Hoffmann         return true;
130*f1488facSGerd Hoffmann     }
131*f1488facSGerd Hoffmann     return false;
132*f1488facSGerd Hoffmann }
133*f1488facSGerd Hoffmann 
uefi_vars_is_sb_db(uefi_variable * var)134*f1488facSGerd Hoffmann static bool uefi_vars_is_sb_db(uefi_variable *var)
135*f1488facSGerd Hoffmann {
136*f1488facSGerd Hoffmann     if (!qemu_uuid_is_equal(&var->guid, &EfiImageSecurityDatabase)) {
137*f1488facSGerd Hoffmann         return false;
138*f1488facSGerd Hoffmann     }
139*f1488facSGerd Hoffmann     if (uefi_str_equal(var->name, var->name_size, name_db, sizeof(name_db))) {
140*f1488facSGerd Hoffmann         return true;
141*f1488facSGerd Hoffmann     }
142*f1488facSGerd Hoffmann     if (uefi_str_equal(var->name, var->name_size, name_dbx, sizeof(name_dbx))) {
143*f1488facSGerd Hoffmann         return true;
144*f1488facSGerd Hoffmann     }
145*f1488facSGerd Hoffmann     return false;
146*f1488facSGerd Hoffmann }
147*f1488facSGerd Hoffmann 
uefi_vars_is_sb_any(uefi_variable * var)148*f1488facSGerd Hoffmann bool uefi_vars_is_sb_any(uefi_variable *var)
149*f1488facSGerd Hoffmann {
150*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_pk(var) ||
151*f1488facSGerd Hoffmann         uefi_vars_is_sb_kek(var) ||
152*f1488facSGerd Hoffmann         uefi_vars_is_sb_db(var)) {
153*f1488facSGerd Hoffmann         return true;
154*f1488facSGerd Hoffmann     }
155*f1488facSGerd Hoffmann     return false;
156*f1488facSGerd Hoffmann }
157*f1488facSGerd Hoffmann 
uefi_vars_find_siglist(uefi_vars_state * uv,uefi_variable * var)158*f1488facSGerd Hoffmann static uefi_variable *uefi_vars_find_siglist(uefi_vars_state *uv,
159*f1488facSGerd Hoffmann                                              uefi_variable *var)
160*f1488facSGerd Hoffmann {
161*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_pk(var)) {
162*f1488facSGerd Hoffmann         return uefi_vars_find_variable(uv, EfiGlobalVariable,
163*f1488facSGerd Hoffmann                                        name_pk, sizeof(name_pk));
164*f1488facSGerd Hoffmann     }
165*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_kek(var)) {
166*f1488facSGerd Hoffmann         return uefi_vars_find_variable(uv, EfiGlobalVariable,
167*f1488facSGerd Hoffmann                                        name_pk, sizeof(name_pk));
168*f1488facSGerd Hoffmann     }
169*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_db(var)) {
170*f1488facSGerd Hoffmann         return uefi_vars_find_variable(uv, EfiGlobalVariable,
171*f1488facSGerd Hoffmann                                        name_kek, sizeof(name_kek));
172*f1488facSGerd Hoffmann     }
173*f1488facSGerd Hoffmann 
174*f1488facSGerd Hoffmann     return NULL;
175*f1488facSGerd Hoffmann }
176*f1488facSGerd Hoffmann 
uefi_vars_check_auth_2_sb(uefi_vars_state * uv,uefi_variable * var,mm_variable_access * va,void * data,uint64_t data_offset)177*f1488facSGerd Hoffmann static efi_status uefi_vars_check_auth_2_sb(uefi_vars_state *uv,
178*f1488facSGerd Hoffmann                                             uefi_variable *var,
179*f1488facSGerd Hoffmann                                             mm_variable_access *va,
180*f1488facSGerd Hoffmann                                             void *data,
181*f1488facSGerd Hoffmann                                             uint64_t data_offset)
182*f1488facSGerd Hoffmann {
183*f1488facSGerd Hoffmann     variable_auth_2 *auth = data;
184*f1488facSGerd Hoffmann     uefi_variable *siglist;
185*f1488facSGerd Hoffmann 
186*f1488facSGerd Hoffmann     if (custom_mode_is_active(uv)) {
187*f1488facSGerd Hoffmann         /* no authentication in custom mode */
188*f1488facSGerd Hoffmann         return EFI_SUCCESS;
189*f1488facSGerd Hoffmann     }
190*f1488facSGerd Hoffmann 
191*f1488facSGerd Hoffmann     if (setup_mode_is_active(uv) && !uefi_vars_is_sb_pk(var)) {
192*f1488facSGerd Hoffmann         /* no authentication in setup mode (except PK) */
193*f1488facSGerd Hoffmann         return EFI_SUCCESS;
194*f1488facSGerd Hoffmann     }
195*f1488facSGerd Hoffmann 
196*f1488facSGerd Hoffmann     if (auth->hdr_length == 24) {
197*f1488facSGerd Hoffmann         /* no signature (auth->cert_data is empty) */
198*f1488facSGerd Hoffmann         return EFI_SECURITY_VIOLATION;
199*f1488facSGerd Hoffmann     }
200*f1488facSGerd Hoffmann 
201*f1488facSGerd Hoffmann     siglist = uefi_vars_find_siglist(uv, var);
202*f1488facSGerd Hoffmann     if (!siglist && setup_mode_is_active(uv) && uefi_vars_is_sb_pk(var)) {
203*f1488facSGerd Hoffmann         /* check PK is self-signed */
204*f1488facSGerd Hoffmann         uefi_variable tmp = {
205*f1488facSGerd Hoffmann             .guid       = EfiGlobalVariable,
206*f1488facSGerd Hoffmann             .name       = (uint16_t *)name_pk,
207*f1488facSGerd Hoffmann             .name_size  = sizeof(name_pk),
208*f1488facSGerd Hoffmann             .attributes = sigdb_attrs,
209*f1488facSGerd Hoffmann             .data       = data + data_offset,
210*f1488facSGerd Hoffmann             .data_size  = va->data_size - data_offset,
211*f1488facSGerd Hoffmann         };
212*f1488facSGerd Hoffmann         return uefi_vars_check_pkcs7_2(&tmp, NULL, NULL, va, data);
213*f1488facSGerd Hoffmann     }
214*f1488facSGerd Hoffmann 
215*f1488facSGerd Hoffmann     return uefi_vars_check_pkcs7_2(siglist, NULL, NULL, va, data);
216*f1488facSGerd Hoffmann }
217*f1488facSGerd Hoffmann 
uefi_vars_check_auth_2(uefi_vars_state * uv,uefi_variable * var,mm_variable_access * va,void * data)218*f1488facSGerd Hoffmann efi_status uefi_vars_check_auth_2(uefi_vars_state *uv, uefi_variable *var,
219*f1488facSGerd Hoffmann                                   mm_variable_access *va, void *data)
220*f1488facSGerd Hoffmann {
221*f1488facSGerd Hoffmann     variable_auth_2 *auth = data;
222*f1488facSGerd Hoffmann     uint64_t data_offset;
223*f1488facSGerd Hoffmann     efi_status status;
224*f1488facSGerd Hoffmann 
225*f1488facSGerd Hoffmann     if (va->data_size < sizeof(*auth)) {
226*f1488facSGerd Hoffmann         return EFI_SECURITY_VIOLATION;
227*f1488facSGerd Hoffmann     }
228*f1488facSGerd Hoffmann     if (uadd64_overflow(sizeof(efi_time), auth->hdr_length, &data_offset)) {
229*f1488facSGerd Hoffmann         return EFI_SECURITY_VIOLATION;
230*f1488facSGerd Hoffmann     }
231*f1488facSGerd Hoffmann     if (va->data_size < data_offset) {
232*f1488facSGerd Hoffmann         return EFI_SECURITY_VIOLATION;
233*f1488facSGerd Hoffmann     }
234*f1488facSGerd Hoffmann 
235*f1488facSGerd Hoffmann     if (auth->hdr_revision != 0x0200 ||
236*f1488facSGerd Hoffmann         auth->hdr_cert_type != WIN_CERT_TYPE_EFI_GUID ||
237*f1488facSGerd Hoffmann         !qemu_uuid_is_equal(&auth->guid_cert_type, &EfiCertTypePkcs7Guid)) {
238*f1488facSGerd Hoffmann         return EFI_UNSUPPORTED;
239*f1488facSGerd Hoffmann     }
240*f1488facSGerd Hoffmann 
241*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_any(var)) {
242*f1488facSGerd Hoffmann         /* secure boot variables */
243*f1488facSGerd Hoffmann         status = uefi_vars_check_auth_2_sb(uv, var, va, data, data_offset);
244*f1488facSGerd Hoffmann         if (status != EFI_SUCCESS) {
245*f1488facSGerd Hoffmann             return status;
246*f1488facSGerd Hoffmann         }
247*f1488facSGerd Hoffmann     } else {
248*f1488facSGerd Hoffmann         /* other authenticated variables */
249*f1488facSGerd Hoffmann         status = uefi_vars_check_pkcs7_2(NULL,
250*f1488facSGerd Hoffmann                                          &var->digest, &var->digest_size,
251*f1488facSGerd Hoffmann                                          va, data);
252*f1488facSGerd Hoffmann         if (status != EFI_SUCCESS) {
253*f1488facSGerd Hoffmann             return status;
254*f1488facSGerd Hoffmann         }
255*f1488facSGerd Hoffmann     }
256*f1488facSGerd Hoffmann 
257*f1488facSGerd Hoffmann     /* checks passed, set variable data */
258*f1488facSGerd Hoffmann     var->time = auth->timestamp;
259*f1488facSGerd Hoffmann     if (va->data_size - data_offset > 0) {
260*f1488facSGerd Hoffmann         var->data = g_malloc(va->data_size - data_offset);
261*f1488facSGerd Hoffmann         memcpy(var->data, data + data_offset, va->data_size - data_offset);
262*f1488facSGerd Hoffmann         var->data_size = va->data_size - data_offset;
263*f1488facSGerd Hoffmann     }
264*f1488facSGerd Hoffmann 
265*f1488facSGerd Hoffmann     return EFI_SUCCESS;
266*f1488facSGerd Hoffmann }
267*f1488facSGerd Hoffmann 
uefi_vars_check_secure_boot(uefi_vars_state * uv,uefi_variable * var)268*f1488facSGerd Hoffmann efi_status uefi_vars_check_secure_boot(uefi_vars_state *uv, uefi_variable *var)
269*f1488facSGerd Hoffmann {
270*f1488facSGerd Hoffmann     uint8_t *value = var->data;
271*f1488facSGerd Hoffmann 
272*f1488facSGerd Hoffmann     if (uefi_vars_is_sb_any(var)) {
273*f1488facSGerd Hoffmann         if (var->attributes != sigdb_attrs) {
274*f1488facSGerd Hoffmann             return EFI_INVALID_PARAMETER;
275*f1488facSGerd Hoffmann         }
276*f1488facSGerd Hoffmann     }
277*f1488facSGerd Hoffmann 
278*f1488facSGerd Hoffmann     /* reject SecureBootEnable updates if force_secure_boot is set */
279*f1488facSGerd Hoffmann     if (qemu_uuid_is_equal(&var->guid, &EfiSecureBootEnableDisable) &&
280*f1488facSGerd Hoffmann         uefi_str_equal(var->name, var->name_size,
281*f1488facSGerd Hoffmann                        name_sb_enable, sizeof(name_sb_enable)) &&
282*f1488facSGerd Hoffmann         uv->force_secure_boot &&
283*f1488facSGerd Hoffmann         value[0] != SECURE_BOOT_ENABLE) {
284*f1488facSGerd Hoffmann         return EFI_WRITE_PROTECTED;
285*f1488facSGerd Hoffmann     }
286*f1488facSGerd Hoffmann 
287*f1488facSGerd Hoffmann     /* reject CustomMode updates if disable_custom_mode is set */
288*f1488facSGerd Hoffmann     if (qemu_uuid_is_equal(&var->guid, &EfiCustomModeEnable) &&
289*f1488facSGerd Hoffmann         uefi_str_equal(var->name, var->name_size,
290*f1488facSGerd Hoffmann                        name_custom_mode, sizeof(name_custom_mode)) &&
291*f1488facSGerd Hoffmann         uv->disable_custom_mode) {
292*f1488facSGerd Hoffmann         return EFI_WRITE_PROTECTED;
293*f1488facSGerd Hoffmann     }
294*f1488facSGerd Hoffmann 
295*f1488facSGerd Hoffmann     return EFI_SUCCESS;
296*f1488facSGerd Hoffmann }
297*f1488facSGerd Hoffmann 
298*f1488facSGerd Hoffmann /* AuthVariableLibInitialize */
uefi_vars_auth_init(uefi_vars_state * uv)299*f1488facSGerd Hoffmann void uefi_vars_auth_init(uefi_vars_state *uv)
300*f1488facSGerd Hoffmann {
301*f1488facSGerd Hoffmann     uefi_variable *pk_var, *sbe_var;
302*f1488facSGerd Hoffmann     uint8_t platform_mode, sb, sbe, vk;
303*f1488facSGerd Hoffmann 
304*f1488facSGerd Hoffmann     /* SetupMode */
305*f1488facSGerd Hoffmann     pk_var = uefi_vars_find_variable(uv, EfiGlobalVariable,
306*f1488facSGerd Hoffmann                                      name_pk, sizeof(name_pk));
307*f1488facSGerd Hoffmann     if (!pk_var) {
308*f1488facSGerd Hoffmann         platform_mode = SETUP_MODE;
309*f1488facSGerd Hoffmann     } else {
310*f1488facSGerd Hoffmann         platform_mode = USER_MODE;
311*f1488facSGerd Hoffmann     }
312*f1488facSGerd Hoffmann     set_setup_mode(uv, platform_mode);
313*f1488facSGerd Hoffmann 
314*f1488facSGerd Hoffmann     /* SignatureSupport */
315*f1488facSGerd Hoffmann     set_signature_support(uv);
316*f1488facSGerd Hoffmann 
317*f1488facSGerd Hoffmann     /* SecureBootEnable */
318*f1488facSGerd Hoffmann     sbe = SECURE_BOOT_DISABLE;
319*f1488facSGerd Hoffmann     sbe_var = uefi_vars_find_variable(uv, EfiSecureBootEnableDisable,
320*f1488facSGerd Hoffmann                                       name_sb_enable, sizeof(name_sb_enable));
321*f1488facSGerd Hoffmann     if (sbe_var) {
322*f1488facSGerd Hoffmann         if (platform_mode == USER_MODE) {
323*f1488facSGerd Hoffmann             sbe = ((uint8_t *)sbe_var->data)[0];
324*f1488facSGerd Hoffmann         }
325*f1488facSGerd Hoffmann     } else if (platform_mode == USER_MODE) {
326*f1488facSGerd Hoffmann         sbe = SECURE_BOOT_ENABLE;
327*f1488facSGerd Hoffmann         set_secure_boot_enable(uv, sbe);
328*f1488facSGerd Hoffmann     }
329*f1488facSGerd Hoffmann 
330*f1488facSGerd Hoffmann     if (uv->force_secure_boot && sbe != SECURE_BOOT_ENABLE) {
331*f1488facSGerd Hoffmann         sbe = SECURE_BOOT_ENABLE;
332*f1488facSGerd Hoffmann         set_secure_boot_enable(uv, sbe);
333*f1488facSGerd Hoffmann     }
334*f1488facSGerd Hoffmann 
335*f1488facSGerd Hoffmann     /* SecureBoot */
336*f1488facSGerd Hoffmann     if ((sbe == SECURE_BOOT_ENABLE) && (platform_mode == USER_MODE)) {
337*f1488facSGerd Hoffmann         sb = SECURE_BOOT_MODE_ENABLE;
338*f1488facSGerd Hoffmann     } else {
339*f1488facSGerd Hoffmann         sb = SECURE_BOOT_MODE_DISABLE;
340*f1488facSGerd Hoffmann     }
341*f1488facSGerd Hoffmann     set_secure_boot(uv, sb);
342*f1488facSGerd Hoffmann 
343*f1488facSGerd Hoffmann     /* CustomMode */
344*f1488facSGerd Hoffmann     set_custom_mode(uv, STANDARD_SECURE_BOOT_MODE);
345*f1488facSGerd Hoffmann 
346*f1488facSGerd Hoffmann     vk = 0;
347*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiGlobalVariable,
348*f1488facSGerd Hoffmann                            name_vk_nv, sizeof(name_vk_nv),
349*f1488facSGerd Hoffmann                            EFI_VARIABLE_NON_VOLATILE |
350*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS |
351*f1488facSGerd Hoffmann                            EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS,
352*f1488facSGerd Hoffmann                            &vk, sizeof(vk));
353*f1488facSGerd Hoffmann     uefi_vars_set_variable(uv, EfiGlobalVariable,
354*f1488facSGerd Hoffmann                            name_vk, sizeof(name_vk),
355*f1488facSGerd Hoffmann                            EFI_VARIABLE_BOOTSERVICE_ACCESS |
356*f1488facSGerd Hoffmann                            EFI_VARIABLE_RUNTIME_ACCESS,
357*f1488facSGerd Hoffmann                            &vk, sizeof(vk));
358*f1488facSGerd Hoffmann 
359*f1488facSGerd Hoffmann     /* flush to disk */
360*f1488facSGerd Hoffmann     uefi_vars_json_save(uv);
361*f1488facSGerd Hoffmann }
362