]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c
MdeModulePkg: VarCheckUefiLib: Add DeployedMode/AuditMode var check logic
[mirror_edk2.git] / MdeModulePkg / Library / VarCheckUefiLib / VarCheckUefiLibNullClass.c
CommitLineData
b85488b3
SZ
1/** @file\r
2 Implementation functions and structures for var check uefi library.\r
3\r
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <Library/VarCheckLib.h>\r
16#include <Library/BaseLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/DebugLib.h>\r
19#include <Library/DevicePathLib.h>\r
20\r
21#include <Guid/VariableFormat.h>\r
22#include <Guid/GlobalVariable.h>\r
23#include <Guid/HardwareErrorVariable.h>\r
24#include <Guid/ImageAuthentication.h>\r
25\r
26typedef\r
27EFI_STATUS\r
28(EFIAPI *INTERNAL_VAR_CHECK_FUNCTION) (\r
29 IN VAR_CHECK_VARIABLE_PROPERTY *Propery,\r
30 IN UINTN DataSize,\r
31 IN VOID *Data\r
32 );\r
33\r
34typedef struct {\r
35 CHAR16 *Name;\r
36 VAR_CHECK_VARIABLE_PROPERTY VariableProperty;\r
37 INTERNAL_VAR_CHECK_FUNCTION CheckFunction;\r
38} UEFI_DEFINED_VARIABLE_ENTRY;\r
39\r
40/**\r
41 Internal check for load option.\r
42\r
43 @param[in] VariablePropery Pointer to variable property.\r
44 @param[in] DataSize Data size.\r
45 @param[in] Data Pointer to data buffer.\r
46\r
47 @retval EFI_SUCCESS The SetVariable check result was success.\r
48 @retval EFI_INVALID_PARAMETER The data buffer is not a valid load option.\r
49\r
50**/\r
51EFI_STATUS\r
52EFIAPI\r
53InternalVarCheckLoadOption (\r
54 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
55 IN UINTN DataSize,\r
56 IN VOID *Data\r
57 )\r
58{\r
59 UINT16 FilePathListLength;\r
60 CHAR16 *Description;\r
61 EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
62\r
63 FilePathListLength = *((UINT16 *) ((UINTN) Data + sizeof (UINT32)));\r
64\r
65 //\r
66 // Check Description\r
67 //\r
68 Description = (CHAR16 *) ((UINTN) Data + sizeof (UINT32) + sizeof (UINT16));\r
69 while (Description < (CHAR16 *) ((UINTN) Data + DataSize)) {\r
70 if (*Description == L'\0') {\r
71 break;\r
72 }\r
73 Description++;\r
74 }\r
75 if ((UINTN) Description >= ((UINTN) Data + DataSize)) {\r
76 return EFI_INVALID_PARAMETER;\r
77 }\r
78 Description++;\r
79\r
80 //\r
81 // Check FilePathList\r
82 //\r
83 FilePathList = (EFI_DEVICE_PATH_PROTOCOL *) Description;\r
84 if ((UINTN) FilePathList > (MAX_ADDRESS - FilePathListLength)) {\r
85 return EFI_INVALID_PARAMETER;\r
86 }\r
87 if (((UINTN) FilePathList + FilePathListLength) > ((UINTN) Data + DataSize)) {\r
88 return EFI_INVALID_PARAMETER;\r
89 }\r
90 if (FilePathListLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
91 return EFI_INVALID_PARAMETER;\r
92 }\r
93 if (!IsDevicePathValid (FilePathList, FilePathListLength)) {\r
94 return EFI_INVALID_PARAMETER;\r
95 }\r
96\r
97 return EFI_SUCCESS;\r
98}\r
99\r
100/**\r
101 Internal check for key option.\r
102\r
103 @param[in] VariablePropery Pointer to variable property.\r
104 @param[in] DataSize Data size.\r
105 @param[in] Data Pointer to data buffer.\r
106\r
107 @retval EFI_SUCCESS The SetVariable check result was success.\r
108 @retval EFI_INVALID_PARAMETER The data buffer is not a valid key option.\r
109\r
110**/\r
111EFI_STATUS\r
112EFIAPI\r
113InternalVarCheckKeyOption (\r
114 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
115 IN UINTN DataSize,\r
116 IN VOID *Data\r
117 )\r
118{\r
119 if (((DataSize - sizeof (EFI_KEY_OPTION)) % sizeof (EFI_INPUT_KEY)) != 0) {\r
120 return EFI_INVALID_PARAMETER;\r
121 }\r
122\r
123 return EFI_SUCCESS;\r
124}\r
125\r
126/**\r
127 Internal check for device path.\r
128\r
129 @param[in] VariablePropery Pointer to variable property.\r
130 @param[in] DataSize Data size.\r
131 @param[in] Data Pointer to data buffer.\r
132\r
133 @retval EFI_SUCCESS The SetVariable check result was success.\r
134 @retval EFI_INVALID_PARAMETER The data buffer is not a valid device path.\r
135\r
136**/\r
137EFI_STATUS\r
138EFIAPI\r
139InternalVarCheckDevicePath (\r
140 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
141 IN UINTN DataSize,\r
142 IN VOID *Data\r
143 )\r
144{\r
145 if (!IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL *) Data, DataSize)) {\r
146 return EFI_INVALID_PARAMETER;\r
147 }\r
148 return EFI_SUCCESS;\r
149}\r
150\r
151/**\r
152 Internal check for ASCII string.\r
153\r
154 @param[in] VariablePropery Pointer to variable property.\r
155 @param[in] DataSize Data size.\r
156 @param[in] Data Pointer to data buffer.\r
157\r
158 @retval EFI_SUCCESS The SetVariable check result was success.\r
159 @retval EFI_INVALID_PARAMETER The data buffer is not a Null-terminated ASCII string.\r
160\r
161**/\r
162EFI_STATUS\r
163EFIAPI\r
164InternalVarCheckAsciiString (\r
165 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
166 IN UINTN DataSize,\r
167 IN VOID *Data\r
168 )\r
169{\r
170 CHAR8 *String;\r
171 UINTN Index;\r
172\r
173 String = (CHAR8 *) Data;\r
174 if (String[DataSize - 1] == '\0') {\r
175 return EFI_SUCCESS;\r
176 } else {\r
177 for (Index = 1; Index < DataSize && (String[DataSize - 1 - Index] != '\0'); Index++);\r
178 if (Index == DataSize) {\r
179 return EFI_INVALID_PARAMETER;\r
180 }\r
181 }\r
182 return EFI_SUCCESS;\r
183}\r
184\r
185/**\r
186 Internal check for size array.\r
187\r
188 @param[in] VariablePropery Pointer to variable property.\r
189 @param[in] DataSize Data size.\r
190 @param[in] Data Pointer to data buffer.\r
191\r
192 @retval EFI_SUCCESS The SetVariable check result was success.\r
193 @retval EFI_INVALID_PARAMETER The DataSize is not size array.\r
194\r
195**/\r
196EFI_STATUS\r
197EFIAPI\r
198InternalVarCheckSizeArray (\r
199 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
200 IN UINTN DataSize,\r
201 IN VOID *Data\r
202 )\r
203{\r
204 if ((DataSize % VariablePropery->MinSize) != 0) {\r
205 return EFI_INVALID_PARAMETER;\r
206 }\r
207 return EFI_SUCCESS;\r
208}\r
209\r
210//\r
211// To prevent name collisions with possible future globally defined variables,\r
212// other internal firmware data variables that are not defined here must be\r
213// saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
214// any other GUID defined by the UEFI Specification. Implementations must\r
215// only permit the creation of variables with a UEFI Specification-defined\r
216// VendorGuid when these variables are documented in the UEFI Specification.\r
217//\r
218UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList[] = {\r
219 {\r
220 EFI_LANG_CODES_VARIABLE_NAME,\r
221 {\r
222 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
223 0,\r
224 VARIABLE_ATTRIBUTE_BS_RT,\r
225 1,\r
226 MAX_UINTN\r
227 },\r
228 InternalVarCheckAsciiString\r
229 },\r
230 {\r
231 EFI_LANG_VARIABLE_NAME,\r
232 {\r
233 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
234 0,\r
235 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
236 1,\r
237 MAX_UINTN\r
238 },\r
239 InternalVarCheckAsciiString\r
240 },\r
241 {\r
242 EFI_TIME_OUT_VARIABLE_NAME,\r
243 {\r
244 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
245 0,\r
246 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
247 sizeof (UINT16),\r
248 sizeof (UINT16)\r
249 },\r
250 NULL\r
251 },\r
252 {\r
253 EFI_PLATFORM_LANG_CODES_VARIABLE_NAME,\r
254 {\r
255 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
256 0,\r
257 VARIABLE_ATTRIBUTE_BS_RT,\r
258 1,\r
259 MAX_UINTN\r
260 },\r
261 InternalVarCheckAsciiString\r
262 },\r
263 {\r
264 EFI_PLATFORM_LANG_VARIABLE_NAME,\r
265 {\r
266 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
267 0,\r
268 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
269 1,\r
270 MAX_UINTN\r
271 },\r
272 InternalVarCheckAsciiString\r
273 },\r
274 {\r
275 EFI_CON_IN_VARIABLE_NAME,\r
276 {\r
277 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
278 0,\r
279 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
280 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
281 MAX_UINTN\r
282 },\r
283 InternalVarCheckDevicePath\r
284 },\r
285 {\r
286 EFI_CON_OUT_VARIABLE_NAME,\r
287 {\r
288 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
289 0,\r
290 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
291 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
292 MAX_UINTN\r
293 },\r
294 InternalVarCheckDevicePath\r
295 },\r
296 {\r
297 EFI_ERR_OUT_VARIABLE_NAME,\r
298 {\r
299 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
300 0,\r
301 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
302 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
303 MAX_UINTN\r
304 },\r
305 InternalVarCheckDevicePath\r
306 },\r
307 {\r
308 EFI_CON_IN_DEV_VARIABLE_NAME,\r
309 {\r
310 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
311 0,\r
312 VARIABLE_ATTRIBUTE_BS_RT,\r
313 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
314 MAX_UINTN\r
315 },\r
316 InternalVarCheckDevicePath\r
317 },\r
318 {\r
319 EFI_CON_OUT_DEV_VARIABLE_NAME,\r
320 {\r
321 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
322 0,\r
323 VARIABLE_ATTRIBUTE_BS_RT,\r
324 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
325 MAX_UINTN\r
326 },\r
327 InternalVarCheckDevicePath\r
328 },\r
329 {\r
330 EFI_ERR_OUT_DEV_VARIABLE_NAME,\r
331 {\r
332 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
333 0,\r
334 VARIABLE_ATTRIBUTE_BS_RT,\r
335 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
336 MAX_UINTN\r
337 },\r
338 InternalVarCheckDevicePath\r
339 },\r
340 {\r
341 EFI_BOOT_ORDER_VARIABLE_NAME,\r
342 {\r
343 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
344 0,\r
345 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
346 sizeof (UINT16),\r
347 MAX_UINTN\r
348 },\r
349 InternalVarCheckSizeArray\r
350 },\r
351 {\r
352 EFI_BOOT_NEXT_VARIABLE_NAME,\r
353 {\r
354 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
355 0,\r
356 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
357 sizeof (UINT16),\r
358 sizeof (UINT16)\r
359 },\r
360 NULL\r
361 },\r
362 {\r
363 EFI_BOOT_CURRENT_VARIABLE_NAME,\r
364 {\r
365 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
366 0,\r
367 VARIABLE_ATTRIBUTE_BS_RT,\r
368 sizeof (UINT16),\r
369 sizeof (UINT16)\r
370 },\r
371 NULL\r
372 },\r
373 {\r
374 EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME,\r
375 {\r
376 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
377 0,\r
378 VARIABLE_ATTRIBUTE_BS_RT,\r
379 sizeof (UINT32),\r
380 sizeof (UINT32)\r
381 },\r
382 NULL\r
383 },\r
384 {\r
385 EFI_DRIVER_ORDER_VARIABLE_NAME,\r
386 {\r
387 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
388 0,\r
389 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
390 sizeof (UINT16),\r
391 MAX_UINTN\r
392 },\r
393 InternalVarCheckSizeArray\r
394 },\r
395 {\r
396 EFI_SYS_PREP_ORDER_VARIABLE_NAME,\r
397 {\r
398 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
399 0,\r
400 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
401 sizeof (UINT16),\r
402 MAX_UINTN\r
403 },\r
404 InternalVarCheckSizeArray\r
405 },\r
406 {\r
407 EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME,\r
408 {\r
409 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
410 0,\r
411 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
412 sizeof (UINT16),\r
413 sizeof (UINT16)\r
414 },\r
415 NULL\r
416 },\r
417 {\r
418 EFI_SETUP_MODE_NAME,\r
419 {\r
420 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
421 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
422 VARIABLE_ATTRIBUTE_BS_RT,\r
423 sizeof (UINT8),\r
424 sizeof (UINT8)\r
425 },\r
426 NULL\r
427 },\r
0f4f6d20
CZ
428 {\r
429 EFI_AUDIT_MODE_NAME,\r
430 {\r
431 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
432 0,\r
433 VARIABLE_ATTRIBUTE_BS_RT,\r
434 sizeof (UINT8),\r
435 sizeof (UINT8)\r
436 },\r
437 NULL\r
438 },\r
439 {\r
440 EFI_DEPLOYED_MODE_NAME,\r
441 {\r
442 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
443 0,\r
444 VARIABLE_ATTRIBUTE_BS_RT,\r
445 sizeof (UINT8),\r
446 sizeof (UINT8)\r
447 },\r
448 NULL\r
449 },\r
b85488b3
SZ
450 {\r
451 EFI_KEY_EXCHANGE_KEY_NAME,\r
452 {\r
453 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
454 0,\r
455 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
456 1,\r
457 MAX_UINTN\r
458 },\r
459 NULL\r
460 },\r
461 {\r
462 EFI_PLATFORM_KEY_NAME,\r
463 {\r
464 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
465 0,\r
466 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
467 1,\r
468 MAX_UINTN\r
469 },\r
470 NULL\r
471 },\r
472 {\r
473 EFI_SIGNATURE_SUPPORT_NAME,\r
474 {\r
475 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
476 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
477 VARIABLE_ATTRIBUTE_BS_RT,\r
478 sizeof (EFI_GUID),\r
479 MAX_UINTN\r
480 },\r
481 InternalVarCheckSizeArray\r
482 },\r
483 {\r
484 EFI_SECURE_BOOT_MODE_NAME,\r
485 {\r
486 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
487 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
488 VARIABLE_ATTRIBUTE_BS_RT,\r
489 sizeof (UINT8),\r
490 sizeof (UINT8)\r
491 },\r
492 NULL\r
493 },\r
494 {\r
495 EFI_KEK_DEFAULT_VARIABLE_NAME,\r
496 {\r
497 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
498 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
499 VARIABLE_ATTRIBUTE_BS_RT,\r
500 1,\r
501 MAX_UINTN\r
502 },\r
503 NULL\r
504 },\r
505 {\r
506 EFI_PK_DEFAULT_VARIABLE_NAME,\r
507 {\r
508 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
509 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
510 VARIABLE_ATTRIBUTE_BS_RT,\r
511 1,\r
512 MAX_UINTN\r
513 },\r
514 NULL\r
515 },\r
516 {\r
517 EFI_DB_DEFAULT_VARIABLE_NAME,\r
518 {\r
519 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
520 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
521 VARIABLE_ATTRIBUTE_BS_RT,\r
522 1,\r
523 MAX_UINTN\r
524 },\r
525 NULL\r
526 },\r
527 {\r
528 EFI_DBX_DEFAULT_VARIABLE_NAME,\r
529 {\r
530 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
531 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
532 VARIABLE_ATTRIBUTE_BS_RT,\r
533 1,\r
534 MAX_UINTN\r
535 },\r
536 NULL\r
537 },\r
538 {\r
539 EFI_DBT_DEFAULT_VARIABLE_NAME,\r
540 {\r
541 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
542 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
543 VARIABLE_ATTRIBUTE_BS_RT,\r
544 1,\r
545 MAX_UINTN\r
546 },\r
547 NULL\r
548 },\r
549 {\r
550 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,\r
551 {\r
552 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
553 0,\r
554 VARIABLE_ATTRIBUTE_BS_RT,\r
555 sizeof (UINT64),\r
556 sizeof (UINT64)\r
557 },\r
558 NULL\r
559 },\r
560 {\r
561 EFI_OS_INDICATIONS_VARIABLE_NAME,\r
562 {\r
563 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
564 0,\r
565 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
566 sizeof (UINT64),\r
567 sizeof (UINT64)\r
568 },\r
569 NULL\r
570 },\r
571 {\r
572 EFI_VENDOR_KEYS_VARIABLE_NAME,\r
573 {\r
574 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
575 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
576 VARIABLE_ATTRIBUTE_BS_RT,\r
577 sizeof (UINT8),\r
578 sizeof (UINT8)\r
579 },\r
580 NULL\r
581 },\r
582};\r
583\r
584UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList2[] = {\r
585 {\r
586 L"Boot####",\r
587 {\r
588 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
589 0,\r
590 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
591 sizeof (UINT32) + sizeof (UINT16),\r
592 MAX_UINTN\r
593 },\r
594 InternalVarCheckLoadOption\r
595 },\r
596 {\r
597 L"Driver####",\r
598 {\r
599 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
600 0,\r
601 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
602 sizeof (UINT32) + sizeof (UINT16),\r
603 MAX_UINTN\r
604 },\r
605 InternalVarCheckLoadOption\r
606 },\r
607 {\r
608 L"SysPrep####",\r
609 {\r
610 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
611 0,\r
612 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
613 sizeof (UINT32) + sizeof (UINT16),\r
614 MAX_UINTN\r
615 },\r
616 InternalVarCheckLoadOption\r
617 },\r
618 {\r
619 L"Key####",\r
620 {\r
621 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
622 0,\r
623 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
624 sizeof (EFI_KEY_OPTION),\r
625 sizeof (EFI_KEY_OPTION) + 3 * sizeof (EFI_INPUT_KEY)\r
626 },\r
627 InternalVarCheckKeyOption\r
628 },\r
51b655a8
RN
629 {\r
630 L"PlatformRecovery####",\r
631 {\r
632 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
633 0,\r
634 VARIABLE_ATTRIBUTE_BS_RT,\r
635 sizeof (UINT32) + sizeof (UINT16),\r
636 MAX_UINTN\r
637 },\r
638 InternalVarCheckLoadOption\r
639 },\r
b85488b3
SZ
640};\r
641\r
642//\r
643// EFI_IMAGE_SECURITY_DATABASE_GUID\r
644//\r
645UEFI_DEFINED_VARIABLE_ENTRY mImageSecurityVariableList[] = {\r
646 {\r
647 EFI_IMAGE_SECURITY_DATABASE,\r
648 {\r
649 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
650 0,\r
651 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
652 1,\r
653 MAX_UINTN\r
654 },\r
655 NULL\r
656 },\r
657 {\r
658 EFI_IMAGE_SECURITY_DATABASE1,\r
659 {\r
660 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
661 0,\r
662 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
663 1,\r
664 MAX_UINTN\r
665 },\r
666 NULL\r
667 },\r
668 {\r
669 EFI_IMAGE_SECURITY_DATABASE2,\r
670 {\r
671 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
672 0,\r
673 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
674 1,\r
675 MAX_UINTN\r
676 },\r
677 NULL\r
678 },\r
679};\r
680\r
681//\r
682// EFI_HARDWARE_ERROR_VARIABLE\r
683//\r
684UEFI_DEFINED_VARIABLE_ENTRY mHwErrRecVariable = {\r
685 L"HwErrRec####",\r
686 {\r
687 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
688 0,\r
689 VARIABLE_ATTRIBUTE_NV_BS_RT_HR,\r
690 1,\r
691 MAX_UINTN\r
692 },\r
693 NULL\r
694};\r
695\r
696EFI_GUID *mUefiDefinedGuid[] = {\r
697 &gEfiGlobalVariableGuid,\r
698 &gEfiImageSecurityDatabaseGuid,\r
699 &gEfiHardwareErrorVariableGuid\r
700};\r
701\r
702/**\r
703 Check if a Unicode character is a hexadecimal character.\r
704\r
705 This function checks if a Unicode character is a\r
706 hexadecimal character. The valid hexadecimal character is\r
707 L'0' to L'9', L'a' to L'f', or L'A' to L'F'.\r
708\r
709\r
710 @param[in] Char The character to check against.\r
711\r
712 @retval TRUE If the Char is a hexadecmial character.\r
713 @retval FALSE If the Char is not a hexadecmial character.\r
714\r
715**/\r
716BOOLEAN\r
717EFIAPI\r
718VarCheckUefiIsHexaDecimalDigitCharacter (\r
719 IN CHAR16 Char\r
720 )\r
721{\r
722 return (BOOLEAN) ((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F') || (Char >= L'a' && Char <= L'f'));\r
723}\r
724\r
725/**\r
726\r
727 This code checks if variable is hardware error record variable or not.\r
728\r
729 According to UEFI spec, hardware error record variable should use the EFI_HARDWARE_ERROR_VARIABLE VendorGuid\r
730 and have the L"HwErrRec####" name convention, #### is a printed hex value and no 0x or h is included in the hex value.\r
731\r
732 @param[in] VariableName Pointer to variable name.\r
733 @param[in] VendorGuid Variable Vendor Guid.\r
734\r
735 @retval TRUE Variable is hardware error record variable.\r
736 @retval FALSE Variable is not hardware error record variable.\r
737\r
738**/\r
739BOOLEAN\r
740EFIAPI\r
741IsHwErrRecVariable (\r
742 IN CHAR16 *VariableName,\r
743 IN EFI_GUID *VendorGuid\r
744 )\r
745{\r
746 if (!CompareGuid (VendorGuid, &gEfiHardwareErrorVariableGuid) ||\r
747 (StrLen (VariableName) != StrLen (L"HwErrRec####")) ||\r
748 (StrnCmp(VariableName, L"HwErrRec", StrLen (L"HwErrRec")) != 0) ||\r
749 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x8]) ||\r
750 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x9]) ||\r
751 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xA]) ||\r
752 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xB])) {\r
753 return FALSE;\r
754 }\r
755\r
756 return TRUE;\r
757}\r
758\r
759/**\r
760 Get UEFI defined var check function.\r
761\r
762 @param[in] VariableName Pointer to variable name.\r
763 @param[in] VendorGuid Pointer to variable vendor GUID.\r
764 @param[out] VariableProperty Pointer to variable property.\r
765\r
766 @return Internal var check function, NULL if no specific check function.\r
767\r
768**/\r
769INTERNAL_VAR_CHECK_FUNCTION\r
770GetUefiDefinedVarCheckFunction (\r
771 IN CHAR16 *VariableName,\r
772 IN EFI_GUID *VendorGuid,\r
773 OUT VAR_CHECK_VARIABLE_PROPERTY **VariableProperty\r
774 )\r
775{\r
776 UINTN Index;\r
777 UINTN NameLength;\r
778\r
779 if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {\r
780 //\r
781 // Try list 1, exactly match.\r
782 //\r
783 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
784 if (StrCmp (mGlobalVariableList[Index].Name, VariableName) == 0) {\r
785 *VariableProperty = &(mGlobalVariableList[Index].VariableProperty);\r
786 return mGlobalVariableList[Index].CheckFunction;\r
787 }\r
788 }\r
789\r
790 //\r
791 // Try list 2.\r
792 //\r
793 NameLength = StrLen (VariableName) - 4;\r
794 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
795 if ((StrLen (VariableName) == StrLen (mGlobalVariableList2[Index].Name)) &&\r
796 (StrnCmp (VariableName, mGlobalVariableList2[Index].Name, NameLength) == 0) &&\r
797 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength]) &&\r
798 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 1]) &&\r
799 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 2]) &&\r
800 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 3])) {\r
801 *VariableProperty = &(mGlobalVariableList2[Index].VariableProperty);\r
802 return mGlobalVariableList2[Index].CheckFunction;\r
803 }\r
804 }\r
805 }\r
806\r
807 return NULL;\r
808}\r
809\r
810/**\r
811 SetVariable check handler UEFI defined.\r
812\r
813 @param[in] VariableName Name of Variable to set.\r
814 @param[in] VendorGuid Variable vendor GUID.\r
815 @param[in] Attributes Attribute value of the variable.\r
816 @param[in] DataSize Size of Data to set.\r
817 @param[in] Data Data pointer.\r
818\r
819 @retval EFI_SUCCESS The SetVariable check result was success.\r
820 @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, GUID,\r
821 DataSize and Data value was supplied.\r
822 @retval EFI_WRITE_PROTECTED The variable in question is read-only.\r
823\r
824**/\r
825EFI_STATUS\r
826EFIAPI\r
827SetVariableCheckHandlerUefiDefined (\r
828 IN CHAR16 *VariableName,\r
829 IN EFI_GUID *VendorGuid,\r
830 IN UINT32 Attributes,\r
831 IN UINTN DataSize,\r
832 IN VOID *Data\r
833 )\r
834{\r
835 EFI_STATUS Status;\r
836 UINTN Index;\r
837 VAR_CHECK_VARIABLE_PROPERTY Property;\r
838 VAR_CHECK_VARIABLE_PROPERTY *VarCheckProperty;\r
839 INTERNAL_VAR_CHECK_FUNCTION VarCheckFunction;\r
840\r
841 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {\r
842 //\r
843 // Do not check delete variable.\r
844 //\r
845 return EFI_SUCCESS;\r
846 }\r
847\r
848 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
849 if (!IsHwErrRecVariable (VariableName, VendorGuid)) {\r
850 return EFI_INVALID_PARAMETER;\r
851 }\r
852 }\r
853\r
854 for (Index = 0; Index < sizeof (mUefiDefinedGuid)/sizeof (mUefiDefinedGuid[0]); Index++) {\r
855 if (CompareGuid (VendorGuid, mUefiDefinedGuid[Index])) {\r
856 if (VarCheckLibVariablePropertyGet (VariableName, VendorGuid, &Property) == EFI_NOT_FOUND) {\r
857 //\r
858 // To prevent name collisions with possible future globally defined variables,\r
859 // other internal firmware data variables that are not defined here must be\r
860 // saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
861 // any other GUID defined by the UEFI Specification. Implementations must\r
862 // only permit the creation of variables with a UEFI Specification-defined\r
863 // VendorGuid when these variables are documented in the UEFI Specification.\r
864 //\r
865 DEBUG ((EFI_D_INFO, "UEFI Variable Check fail %r - %s not in %g namespace\n", EFI_INVALID_PARAMETER, VariableName, VendorGuid));\r
866 return EFI_INVALID_PARAMETER;\r
867 }\r
868 }\r
869 }\r
870\r
871 if (DataSize == 0) {\r
872 return EFI_SUCCESS;\r
873 }\r
874\r
875 VarCheckProperty = NULL;\r
876 VarCheckFunction = GetUefiDefinedVarCheckFunction (VariableName, VendorGuid, &VarCheckProperty);\r
877 if (VarCheckFunction != NULL) {\r
878 Status = VarCheckFunction (\r
879 VarCheckProperty,\r
880 DataSize,\r
881 Data\r
882 );\r
883 if (EFI_ERROR (Status)) {\r
884 DEBUG ((EFI_D_INFO, "UEFI Variable Check function fail %r - %g:%s\n", Status, VendorGuid, VariableName));\r
885 return Status;\r
886 }\r
887 }\r
888\r
889 return EFI_SUCCESS;\r
890}\r
891\r
892/**\r
893 Variable property set for UEFI defined variables.\r
894\r
895**/\r
896VOID\r
897VariablePropertySetUefiDefined (\r
898 VOID\r
899 )\r
900{\r
901 UINTN Index;\r
902\r
903 //\r
904 // EFI_GLOBAL_VARIABLE\r
905 //\r
906 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
907 VarCheckLibVariablePropertySet (\r
908 mGlobalVariableList[Index].Name,\r
909 &gEfiGlobalVariableGuid,\r
910 &mGlobalVariableList[Index].VariableProperty\r
911 );\r
912 }\r
913 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
914 VarCheckLibVariablePropertySet (\r
915 mGlobalVariableList2[Index].Name,\r
916 &gEfiGlobalVariableGuid,\r
917 &mGlobalVariableList2[Index].VariableProperty\r
918 );\r
919 }\r
920\r
921 //\r
922 // EFI_IMAGE_SECURITY_DATABASE_GUID\r
923 //\r
924 for (Index = 0; Index < sizeof (mImageSecurityVariableList)/sizeof (mImageSecurityVariableList[0]); Index++) {\r
925 VarCheckLibVariablePropertySet (\r
926 mImageSecurityVariableList[Index].Name,\r
927 &gEfiImageSecurityDatabaseGuid,\r
928 &mImageSecurityVariableList[Index].VariableProperty\r
929 );\r
930 }\r
931\r
932 //\r
933 // EFI_HARDWARE_ERROR_VARIABLE\r
934 //\r
935 VarCheckLibVariablePropertySet (\r
936 mHwErrRecVariable.Name,\r
937 &gEfiHardwareErrorVariableGuid,\r
938 &mHwErrRecVariable.VariableProperty\r
939 );\r
940}\r
941\r
942/**\r
943 Constructor function of VarCheckUefiLib to set property and\r
944 register SetVariable check handler for UEFI defined variables.\r
945\r
946 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
947 @param[in] SystemTable A pointer to the EFI System Table.\r
948\r
949 @retval EFI_SUCCESS The constructor executed correctly.\r
950\r
951**/\r
952EFI_STATUS\r
953EFIAPI\r
954VarCheckUefiLibNullClassConstructor (\r
955 IN EFI_HANDLE ImageHandle,\r
956 IN EFI_SYSTEM_TABLE *SystemTable\r
957 )\r
958{\r
959 VariablePropertySetUefiDefined ();\r
960 VarCheckLibRegisterSetVariableCheckHandler (SetVariableCheckHandlerUefiDefined);\r
961\r
962 return EFI_SUCCESS;\r
963}\r