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