]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c
MdeModulePkg: Apply uncrustify changes
[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
1436aea4 24(EFIAPI *INTERNAL_VAR_CHECK_FUNCTION)(\r
b85488b3
SZ
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
1436aea4
MK
31 CHAR16 *Name;\r
32 VAR_CHECK_VARIABLE_PROPERTY VariableProperty;\r
33 INTERNAL_VAR_CHECK_FUNCTION CheckFunction;\r
b85488b3
SZ
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
1436aea4
MK
50 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
51 IN UINTN DataSize,\r
52 IN VOID *Data\r
b85488b3
SZ
53 )\r
54{\r
55 UINT16 FilePathListLength;\r
56 CHAR16 *Description;\r
57 EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
58\r
1436aea4 59 FilePathListLength = *((UINT16 *)((UINTN)Data + sizeof (UINT32)));\r
b85488b3
SZ
60\r
61 //\r
62 // Check Description\r
63 //\r
1436aea4
MK
64 Description = (CHAR16 *)((UINTN)Data + sizeof (UINT32) + sizeof (UINT16));\r
65 while (Description < (CHAR16 *)((UINTN)Data + DataSize)) {\r
b85488b3
SZ
66 if (*Description == L'\0') {\r
67 break;\r
68 }\r
1436aea4 69\r
b85488b3
SZ
70 Description++;\r
71 }\r
1436aea4
MK
72\r
73 if ((UINTN)Description >= ((UINTN)Data + DataSize)) {\r
b85488b3
SZ
74 return EFI_INVALID_PARAMETER;\r
75 }\r
1436aea4 76\r
b85488b3
SZ
77 Description++;\r
78\r
79 //\r
80 // Check FilePathList\r
81 //\r
1436aea4
MK
82 FilePathList = (EFI_DEVICE_PATH_PROTOCOL *)Description;\r
83 if ((UINTN)FilePathList > (MAX_ADDRESS - FilePathListLength)) {\r
b85488b3
SZ
84 return EFI_INVALID_PARAMETER;\r
85 }\r
1436aea4
MK
86\r
87 if (((UINTN)FilePathList + FilePathListLength) > ((UINTN)Data + DataSize)) {\r
b85488b3
SZ
88 return EFI_INVALID_PARAMETER;\r
89 }\r
1436aea4 90\r
b85488b3
SZ
91 if (FilePathListLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
92 return EFI_INVALID_PARAMETER;\r
93 }\r
1436aea4 94\r
b85488b3
SZ
95 if (!IsDevicePathValid (FilePathList, FilePathListLength)) {\r
96 return EFI_INVALID_PARAMETER;\r
97 }\r
98\r
99 return EFI_SUCCESS;\r
100}\r
101\r
102/**\r
103 Internal check for key option.\r
104\r
105 @param[in] VariablePropery Pointer to variable property.\r
106 @param[in] DataSize Data size.\r
107 @param[in] Data Pointer to data buffer.\r
108\r
109 @retval EFI_SUCCESS The SetVariable check result was success.\r
110 @retval EFI_INVALID_PARAMETER The data buffer is not a valid key option.\r
111\r
112**/\r
113EFI_STATUS\r
114EFIAPI\r
115InternalVarCheckKeyOption (\r
1436aea4
MK
116 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
117 IN UINTN DataSize,\r
118 IN VOID *Data\r
b85488b3
SZ
119 )\r
120{\r
121 if (((DataSize - sizeof (EFI_KEY_OPTION)) % sizeof (EFI_INPUT_KEY)) != 0) {\r
122 return EFI_INVALID_PARAMETER;\r
123 }\r
124\r
125 return EFI_SUCCESS;\r
126}\r
127\r
128/**\r
129 Internal check for device path.\r
130\r
131 @param[in] VariablePropery Pointer to variable property.\r
132 @param[in] DataSize Data size.\r
133 @param[in] Data Pointer to data buffer.\r
134\r
135 @retval EFI_SUCCESS The SetVariable check result was success.\r
136 @retval EFI_INVALID_PARAMETER The data buffer is not a valid device path.\r
137\r
138**/\r
139EFI_STATUS\r
140EFIAPI\r
141InternalVarCheckDevicePath (\r
1436aea4
MK
142 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
143 IN UINTN DataSize,\r
144 IN VOID *Data\r
b85488b3
SZ
145 )\r
146{\r
1436aea4 147 if (!IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL *)Data, DataSize)) {\r
b85488b3
SZ
148 return EFI_INVALID_PARAMETER;\r
149 }\r
1436aea4 150\r
b85488b3
SZ
151 return EFI_SUCCESS;\r
152}\r
153\r
154/**\r
155 Internal check for ASCII string.\r
156\r
157 @param[in] VariablePropery Pointer to variable property.\r
158 @param[in] DataSize Data size.\r
159 @param[in] Data Pointer to data buffer.\r
160\r
161 @retval EFI_SUCCESS The SetVariable check result was success.\r
162 @retval EFI_INVALID_PARAMETER The data buffer is not a Null-terminated ASCII string.\r
163\r
164**/\r
165EFI_STATUS\r
166EFIAPI\r
167InternalVarCheckAsciiString (\r
1436aea4
MK
168 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
169 IN UINTN DataSize,\r
170 IN VOID *Data\r
b85488b3
SZ
171 )\r
172{\r
1436aea4
MK
173 CHAR8 *String;\r
174 UINTN Index;\r
b85488b3 175\r
1436aea4 176 String = (CHAR8 *)Data;\r
b85488b3
SZ
177 if (String[DataSize - 1] == '\0') {\r
178 return EFI_SUCCESS;\r
179 } else {\r
1436aea4
MK
180 for (Index = 1; Index < DataSize && (String[DataSize - 1 - Index] != '\0'); Index++) {\r
181 }\r
182\r
b85488b3
SZ
183 if (Index == DataSize) {\r
184 return EFI_INVALID_PARAMETER;\r
185 }\r
186 }\r
1436aea4 187\r
b85488b3
SZ
188 return EFI_SUCCESS;\r
189}\r
190\r
191/**\r
192 Internal check for size array.\r
193\r
194 @param[in] VariablePropery Pointer to variable property.\r
195 @param[in] DataSize Data size.\r
196 @param[in] Data Pointer to data buffer.\r
197\r
198 @retval EFI_SUCCESS The SetVariable check result was success.\r
199 @retval EFI_INVALID_PARAMETER The DataSize is not size array.\r
200\r
201**/\r
202EFI_STATUS\r
203EFIAPI\r
204InternalVarCheckSizeArray (\r
1436aea4
MK
205 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
206 IN UINTN DataSize,\r
207 IN VOID *Data\r
b85488b3
SZ
208 )\r
209{\r
210 if ((DataSize % VariablePropery->MinSize) != 0) {\r
211 return EFI_INVALID_PARAMETER;\r
212 }\r
1436aea4 213\r
b85488b3
SZ
214 return EFI_SUCCESS;\r
215}\r
216\r
217//\r
218// To prevent name collisions with possible future globally defined variables,\r
219// other internal firmware data variables that are not defined here must be\r
220// saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
221// any other GUID defined by the UEFI Specification. Implementations must\r
222// only permit the creation of variables with a UEFI Specification-defined\r
223// VendorGuid when these variables are documented in the UEFI Specification.\r
224//\r
1436aea4 225UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList[] = {\r
b85488b3
SZ
226 {\r
227 EFI_LANG_CODES_VARIABLE_NAME,\r
228 {\r
229 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
230 0,\r
231 VARIABLE_ATTRIBUTE_BS_RT,\r
232 1,\r
233 MAX_UINTN\r
234 },\r
235 InternalVarCheckAsciiString\r
236 },\r
237 {\r
238 EFI_LANG_VARIABLE_NAME,\r
239 {\r
240 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
241 0,\r
242 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
243 1,\r
244 MAX_UINTN\r
245 },\r
246 InternalVarCheckAsciiString\r
247 },\r
248 {\r
249 EFI_TIME_OUT_VARIABLE_NAME,\r
250 {\r
251 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
252 0,\r
253 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
254 sizeof (UINT16),\r
255 sizeof (UINT16)\r
256 },\r
257 NULL\r
258 },\r
259 {\r
260 EFI_PLATFORM_LANG_CODES_VARIABLE_NAME,\r
261 {\r
262 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
263 0,\r
264 VARIABLE_ATTRIBUTE_BS_RT,\r
265 1,\r
266 MAX_UINTN\r
267 },\r
268 InternalVarCheckAsciiString\r
269 },\r
270 {\r
271 EFI_PLATFORM_LANG_VARIABLE_NAME,\r
272 {\r
273 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
274 0,\r
275 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
276 1,\r
277 MAX_UINTN\r
278 },\r
279 InternalVarCheckAsciiString\r
280 },\r
281 {\r
282 EFI_CON_IN_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_CON_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_ERR_OUT_VARIABLE_NAME,\r
305 {\r
306 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
307 0,\r
308 VARIABLE_ATTRIBUTE_NV_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_IN_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_CON_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_ERR_OUT_DEV_VARIABLE_NAME,\r
338 {\r
339 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
340 0,\r
341 VARIABLE_ATTRIBUTE_BS_RT,\r
342 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
343 MAX_UINTN\r
344 },\r
345 InternalVarCheckDevicePath\r
346 },\r
347 {\r
348 EFI_BOOT_ORDER_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 MAX_UINTN\r
355 },\r
356 InternalVarCheckSizeArray\r
357 },\r
358 {\r
359 EFI_BOOT_NEXT_VARIABLE_NAME,\r
360 {\r
361 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
362 0,\r
363 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
364 sizeof (UINT16),\r
365 sizeof (UINT16)\r
366 },\r
367 NULL\r
368 },\r
369 {\r
370 EFI_BOOT_CURRENT_VARIABLE_NAME,\r
371 {\r
372 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
373 0,\r
374 VARIABLE_ATTRIBUTE_BS_RT,\r
375 sizeof (UINT16),\r
376 sizeof (UINT16)\r
377 },\r
378 NULL\r
379 },\r
380 {\r
381 EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME,\r
382 {\r
383 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
384 0,\r
385 VARIABLE_ATTRIBUTE_BS_RT,\r
386 sizeof (UINT32),\r
387 sizeof (UINT32)\r
388 },\r
389 NULL\r
390 },\r
391 {\r
392 EFI_DRIVER_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_SYS_PREP_ORDER_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 MAX_UINTN\r
410 },\r
411 InternalVarCheckSizeArray\r
412 },\r
413 {\r
414 EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME,\r
415 {\r
416 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
417 0,\r
418 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
419 sizeof (UINT16),\r
420 sizeof (UINT16)\r
421 },\r
422 NULL\r
423 },\r
424 {\r
425 EFI_SETUP_MODE_NAME,\r
426 {\r
427 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
428 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
429 VARIABLE_ATTRIBUTE_BS_RT,\r
430 sizeof (UINT8),\r
431 sizeof (UINT8)\r
432 },\r
433 NULL\r
434 },\r
435 {\r
436 EFI_KEY_EXCHANGE_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_PLATFORM_KEY_NAME,\r
448 {\r
449 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
450 0,\r
451 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
452 1,\r
453 MAX_UINTN\r
454 },\r
455 NULL\r
456 },\r
457 {\r
458 EFI_SIGNATURE_SUPPORT_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 (EFI_GUID),\r
464 MAX_UINTN\r
465 },\r
466 InternalVarCheckSizeArray\r
467 },\r
468 {\r
469 EFI_SECURE_BOOT_MODE_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 sizeof (UINT8),\r
475 sizeof (UINT8)\r
476 },\r
477 NULL\r
478 },\r
479 {\r
480 EFI_KEK_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_PK_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_DB_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_DBX_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_DBT_DEFAULT_VARIABLE_NAME,\r
525 {\r
526 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
527 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
528 VARIABLE_ATTRIBUTE_BS_RT,\r
529 1,\r
530 MAX_UINTN\r
531 },\r
532 NULL\r
533 },\r
534 {\r
535 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,\r
536 {\r
537 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
538 0,\r
539 VARIABLE_ATTRIBUTE_BS_RT,\r
540 sizeof (UINT64),\r
541 sizeof (UINT64)\r
542 },\r
543 NULL\r
544 },\r
545 {\r
546 EFI_OS_INDICATIONS_VARIABLE_NAME,\r
547 {\r
548 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
549 0,\r
550 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
551 sizeof (UINT64),\r
552 sizeof (UINT64)\r
553 },\r
554 NULL\r
555 },\r
556 {\r
557 EFI_VENDOR_KEYS_VARIABLE_NAME,\r
558 {\r
559 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
560 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
561 VARIABLE_ATTRIBUTE_BS_RT,\r
562 sizeof (UINT8),\r
563 sizeof (UINT8)\r
564 },\r
565 NULL\r
566 },\r
567};\r
568\r
1436aea4 569UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList2[] = {\r
b85488b3
SZ
570 {\r
571 L"Boot####",\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"Driver####",\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"SysPrep####",\r
594 {\r
595 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
596 0,\r
597 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
598 sizeof (UINT32) + sizeof (UINT16),\r
599 MAX_UINTN\r
600 },\r
601 InternalVarCheckLoadOption\r
602 },\r
603 {\r
604 L"Key####",\r
605 {\r
606 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
607 0,\r
608 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
609 sizeof (EFI_KEY_OPTION),\r
610 sizeof (EFI_KEY_OPTION) + 3 * sizeof (EFI_INPUT_KEY)\r
611 },\r
612 InternalVarCheckKeyOption\r
613 },\r
51b655a8
RN
614 {\r
615 L"PlatformRecovery####",\r
616 {\r
617 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
618 0,\r
619 VARIABLE_ATTRIBUTE_BS_RT,\r
620 sizeof (UINT32) + sizeof (UINT16),\r
621 MAX_UINTN\r
622 },\r
623 InternalVarCheckLoadOption\r
624 },\r
b85488b3
SZ
625};\r
626\r
627//\r
628// EFI_IMAGE_SECURITY_DATABASE_GUID\r
629//\r
1436aea4 630UEFI_DEFINED_VARIABLE_ENTRY mImageSecurityVariableList[] = {\r
b85488b3
SZ
631 {\r
632 EFI_IMAGE_SECURITY_DATABASE,\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_DATABASE1,\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 EFI_IMAGE_SECURITY_DATABASE2,\r
655 {\r
656 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
657 0,\r
658 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
659 1,\r
660 MAX_UINTN\r
661 },\r
662 NULL\r
663 },\r
664};\r
665\r
666//\r
667// EFI_HARDWARE_ERROR_VARIABLE\r
668//\r
1436aea4 669UEFI_DEFINED_VARIABLE_ENTRY mHwErrRecVariable = {\r
b85488b3
SZ
670 L"HwErrRec####",\r
671 {\r
672 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
673 0,\r
674 VARIABLE_ATTRIBUTE_NV_BS_RT_HR,\r
675 1,\r
676 MAX_UINTN\r
677 },\r
678 NULL\r
679};\r
680\r
1436aea4 681EFI_GUID *mUefiDefinedGuid[] = {\r
b85488b3
SZ
682 &gEfiGlobalVariableGuid,\r
683 &gEfiImageSecurityDatabaseGuid,\r
684 &gEfiHardwareErrorVariableGuid\r
685};\r
686\r
687/**\r
6c59c7c2 688 Check if a Unicode character is an upper case hexadecimal character.\r
b85488b3 689\r
6c59c7c2
SZ
690 This function checks if a Unicode character is an upper case\r
691 hexadecimal character. The valid upper case hexadecimal character is\r
692 L'0' to L'9', or L'A' to L'F'.\r
b85488b3
SZ
693\r
694\r
695 @param[in] Char The character to check against.\r
696\r
6c59c7c2
SZ
697 @retval TRUE If the Char is an upper case hexadecmial character.\r
698 @retval FALSE If the Char is not an upper case hexadecmial character.\r
b85488b3
SZ
699\r
700**/\r
701BOOLEAN\r
702EFIAPI\r
703VarCheckUefiIsHexaDecimalDigitCharacter (\r
1436aea4 704 IN CHAR16 Char\r
b85488b3
SZ
705 )\r
706{\r
1436aea4 707 return (BOOLEAN)((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F'));\r
b85488b3
SZ
708}\r
709\r
710/**\r
711\r
712 This code checks if variable is hardware error record variable or not.\r
713\r
714 According to UEFI spec, hardware error record variable should use the EFI_HARDWARE_ERROR_VARIABLE VendorGuid\r
715 and have the L"HwErrRec####" name convention, #### is a printed hex value and no 0x or h is included in the hex value.\r
716\r
717 @param[in] VariableName Pointer to variable name.\r
718 @param[in] VendorGuid Variable Vendor Guid.\r
719\r
720 @retval TRUE Variable is hardware error record variable.\r
721 @retval FALSE Variable is not hardware error record variable.\r
722\r
723**/\r
724BOOLEAN\r
725EFIAPI\r
726IsHwErrRecVariable (\r
1436aea4
MK
727 IN CHAR16 *VariableName,\r
728 IN EFI_GUID *VendorGuid\r
b85488b3
SZ
729 )\r
730{\r
731 if (!CompareGuid (VendorGuid, &gEfiHardwareErrorVariableGuid) ||\r
732 (StrLen (VariableName) != StrLen (L"HwErrRec####")) ||\r
1436aea4 733 (StrnCmp (VariableName, L"HwErrRec", StrLen (L"HwErrRec")) != 0) ||\r
b85488b3
SZ
734 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x8]) ||\r
735 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x9]) ||\r
736 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xA]) ||\r
1436aea4
MK
737 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xB]))\r
738 {\r
b85488b3
SZ
739 return FALSE;\r
740 }\r
741\r
742 return TRUE;\r
743}\r
744\r
745/**\r
746 Get UEFI defined var check function.\r
747\r
748 @param[in] VariableName Pointer to variable name.\r
749 @param[in] VendorGuid Pointer to variable vendor GUID.\r
750 @param[out] VariableProperty Pointer to variable property.\r
751\r
752 @return Internal var check function, NULL if no specific check function.\r
753\r
754**/\r
755INTERNAL_VAR_CHECK_FUNCTION\r
756GetUefiDefinedVarCheckFunction (\r
1436aea4
MK
757 IN CHAR16 *VariableName,\r
758 IN EFI_GUID *VendorGuid,\r
759 OUT VAR_CHECK_VARIABLE_PROPERTY **VariableProperty\r
b85488b3
SZ
760 )\r
761{\r
1436aea4
MK
762 UINTN Index;\r
763 UINTN NameLength;\r
b85488b3
SZ
764\r
765 if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {\r
766 //\r
767 // Try list 1, exactly match.\r
768 //\r
769 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
770 if (StrCmp (mGlobalVariableList[Index].Name, VariableName) == 0) {\r
771 *VariableProperty = &(mGlobalVariableList[Index].VariableProperty);\r
772 return mGlobalVariableList[Index].CheckFunction;\r
773 }\r
774 }\r
775\r
776 //\r
777 // Try list 2.\r
778 //\r
779 NameLength = StrLen (VariableName) - 4;\r
780 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
781 if ((StrLen (VariableName) == StrLen (mGlobalVariableList2[Index].Name)) &&\r
782 (StrnCmp (VariableName, mGlobalVariableList2[Index].Name, NameLength) == 0) &&\r
783 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength]) &&\r
784 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 1]) &&\r
785 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 2]) &&\r
1436aea4
MK
786 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 3]))\r
787 {\r
b85488b3
SZ
788 *VariableProperty = &(mGlobalVariableList2[Index].VariableProperty);\r
789 return mGlobalVariableList2[Index].CheckFunction;\r
790 }\r
791 }\r
792 }\r
793\r
794 return NULL;\r
795}\r
796\r
797/**\r
798 SetVariable check handler UEFI defined.\r
799\r
800 @param[in] VariableName Name of Variable to set.\r
801 @param[in] VendorGuid Variable vendor GUID.\r
802 @param[in] Attributes Attribute value of the variable.\r
803 @param[in] DataSize Size of Data to set.\r
804 @param[in] Data Data pointer.\r
805\r
806 @retval EFI_SUCCESS The SetVariable check result was success.\r
807 @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, GUID,\r
808 DataSize and Data value was supplied.\r
809 @retval EFI_WRITE_PROTECTED The variable in question is read-only.\r
810\r
811**/\r
812EFI_STATUS\r
813EFIAPI\r
814SetVariableCheckHandlerUefiDefined (\r
1436aea4
MK
815 IN CHAR16 *VariableName,\r
816 IN EFI_GUID *VendorGuid,\r
817 IN UINT32 Attributes,\r
818 IN UINTN DataSize,\r
819 IN VOID *Data\r
b85488b3
SZ
820 )\r
821{\r
1436aea4
MK
822 EFI_STATUS Status;\r
823 UINTN Index;\r
824 VAR_CHECK_VARIABLE_PROPERTY Property;\r
825 VAR_CHECK_VARIABLE_PROPERTY *VarCheckProperty;\r
826 INTERNAL_VAR_CHECK_FUNCTION VarCheckFunction;\r
b85488b3
SZ
827\r
828 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {\r
829 //\r
830 // Do not check delete variable.\r
831 //\r
832 return EFI_SUCCESS;\r
833 }\r
834\r
835 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
836 if (!IsHwErrRecVariable (VariableName, VendorGuid)) {\r
837 return EFI_INVALID_PARAMETER;\r
838 }\r
839 }\r
840\r
841 for (Index = 0; Index < sizeof (mUefiDefinedGuid)/sizeof (mUefiDefinedGuid[0]); Index++) {\r
842 if (CompareGuid (VendorGuid, mUefiDefinedGuid[Index])) {\r
843 if (VarCheckLibVariablePropertyGet (VariableName, VendorGuid, &Property) == EFI_NOT_FOUND) {\r
844 //\r
845 // To prevent name collisions with possible future globally defined variables,\r
846 // other internal firmware data variables that are not defined here must be\r
847 // saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
848 // any other GUID defined by the UEFI Specification. Implementations must\r
849 // only permit the creation of variables with a UEFI Specification-defined\r
850 // VendorGuid when these variables are documented in the UEFI Specification.\r
851 //\r
87000d77 852 DEBUG ((DEBUG_INFO, "UEFI Variable Check fail %r - %s not in %g namespace\n", EFI_INVALID_PARAMETER, VariableName, VendorGuid));\r
b85488b3
SZ
853 return EFI_INVALID_PARAMETER;\r
854 }\r
855 }\r
856 }\r
857\r
858 if (DataSize == 0) {\r
859 return EFI_SUCCESS;\r
860 }\r
861\r
862 VarCheckProperty = NULL;\r
863 VarCheckFunction = GetUefiDefinedVarCheckFunction (VariableName, VendorGuid, &VarCheckProperty);\r
864 if (VarCheckFunction != NULL) {\r
865 Status = VarCheckFunction (\r
866 VarCheckProperty,\r
867 DataSize,\r
868 Data\r
869 );\r
870 if (EFI_ERROR (Status)) {\r
87000d77 871 DEBUG ((DEBUG_INFO, "UEFI Variable Check function fail %r - %g:%s\n", Status, VendorGuid, VariableName));\r
b85488b3
SZ
872 return Status;\r
873 }\r
874 }\r
875\r
876 return EFI_SUCCESS;\r
877}\r
878\r
879/**\r
880 Variable property set for UEFI defined variables.\r
881\r
882**/\r
883VOID\r
884VariablePropertySetUefiDefined (\r
885 VOID\r
886 )\r
887{\r
1436aea4 888 UINTN Index;\r
b85488b3
SZ
889\r
890 //\r
891 // EFI_GLOBAL_VARIABLE\r
892 //\r
893 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
894 VarCheckLibVariablePropertySet (\r
895 mGlobalVariableList[Index].Name,\r
896 &gEfiGlobalVariableGuid,\r
897 &mGlobalVariableList[Index].VariableProperty\r
898 );\r
899 }\r
1436aea4 900\r
b85488b3
SZ
901 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
902 VarCheckLibVariablePropertySet (\r
903 mGlobalVariableList2[Index].Name,\r
904 &gEfiGlobalVariableGuid,\r
905 &mGlobalVariableList2[Index].VariableProperty\r
906 );\r
907 }\r
908\r
909 //\r
910 // EFI_IMAGE_SECURITY_DATABASE_GUID\r
911 //\r
912 for (Index = 0; Index < sizeof (mImageSecurityVariableList)/sizeof (mImageSecurityVariableList[0]); Index++) {\r
913 VarCheckLibVariablePropertySet (\r
914 mImageSecurityVariableList[Index].Name,\r
915 &gEfiImageSecurityDatabaseGuid,\r
916 &mImageSecurityVariableList[Index].VariableProperty\r
917 );\r
918 }\r
919\r
920 //\r
921 // EFI_HARDWARE_ERROR_VARIABLE\r
922 //\r
923 VarCheckLibVariablePropertySet (\r
924 mHwErrRecVariable.Name,\r
925 &gEfiHardwareErrorVariableGuid,\r
926 &mHwErrRecVariable.VariableProperty\r
927 );\r
928}\r
929\r
930/**\r
931 Constructor function of VarCheckUefiLib to set property and\r
932 register SetVariable check handler for UEFI defined variables.\r
933\r
b85488b3
SZ
934 @retval EFI_SUCCESS The constructor executed correctly.\r
935\r
936**/\r
070c5a66 937RETURN_STATUS\r
b85488b3
SZ
938EFIAPI\r
939VarCheckUefiLibNullClassConstructor (\r
070c5a66 940 VOID\r
b85488b3
SZ
941 )\r
942{\r
943 VariablePropertySetUefiDefined ();\r
944 VarCheckLibRegisterSetVariableCheckHandler (SetVariableCheckHandlerUefiDefined);\r
945\r
070c5a66 946 return RETURN_SUCCESS;\r
b85488b3 947}\r