]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg OpalPasswordDxe: Clean password buffer.
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
CommitLineData
a06875e1
ED
1/** @file\r
2 Implementation of the HII for the Opal UEFI Driver.\r
3\r
4Copyright (c) 2016, 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 "OpalHii.h"\r
16#include "OpalDriver.h"\r
17#include "OpalHiiPrivate.h"\r
18\r
19//\r
20// This is the generated IFR binary Data for each formset defined in VFR.\r
21// This Data array is ready to be used as input of HiiAddPackages() to\r
22// create a packagelist (which contains Form packages, String packages, etc).\r
23//\r
24extern UINT8 OpalPasswordFormBin[];\r
25\r
26//\r
27// This is the generated String package Data for all .UNI files.\r
28// This Data array is ready to be used as input of HiiAddPackages() to\r
29// create a packagelist (which contains Form packages, String packages, etc).\r
30//\r
31extern UINT8 OpalPasswordDxeStrings[];\r
32\r
eafbd7a2
DB
33CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
34\r
a06875e1
ED
35EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
36\r
37//\r
38// Handle to the list of HII packages (forms and strings) for this driver\r
39//\r
40EFI_HII_HANDLE gHiiPackageListHandle = NULL;\r
41\r
42//\r
43// Package List GUID containing all form and string packages\r
44//\r
45const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID;\r
46const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID;\r
47\r
48//\r
49// Structure that contains state of the HII\r
50// This structure is updated by Hii.cpp and its contents\r
51// is rendered in the HII.\r
52//\r
53OPAL_HII_CONFIGURATION gHiiConfiguration;\r
54\r
55CHAR8 gHiiOldPassword[MAX_PASSWORD_CHARACTER_LENGTH] = {0};\r
56UINT32 gHiiOldPasswordLength = 0;\r
57\r
58//\r
59// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL\r
60//\r
61HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = {\r
62 {\r
63 {\r
64 HARDWARE_DEVICE_PATH,\r
65 HW_VENDOR_DP,\r
66 {\r
67 (UINT8)(sizeof(VENDOR_DEVICE_PATH)),\r
68 (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8)\r
69 }\r
70 },\r
71 OPAL_PASSWORD_CONFIG_GUID\r
72 },\r
73 {\r
74 END_DEVICE_PATH_TYPE,\r
75 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
76 {\r
77 (UINT8)(END_DEVICE_PATH_LENGTH),\r
78 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
79 }\r
80 }\r
81};\r
82\r
83\r
84/**\r
85 Sets the current system state of global config variables.\r
86\r
87**/\r
88VOID\r
89HiiSetCurrentConfiguration(\r
90 VOID\r
91 )\r
92{\r
9de81c12
ED
93 UINT32 PpStorageFlag;\r
94 EFI_STRING NewString;\r
a06875e1
ED
95\r
96 gHiiConfiguration.NumDisks = GetDeviceCount();\r
97\r
9de81c12
ED
98 //\r
99 // Update the BlockSID status string.\r
100 //\r
101 PpStorageFlag = TcgPhysicalPresenceStorageLibReturnStorageFlags();\r
102\r
103 if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
104 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
105 if (NewString == NULL) {\r
106 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
107 return;\r
108 }\r
109 } else {\r
110 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
111 if (NewString == NULL) {\r
112 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
113 return;\r
114 }\r
115 }\r
116 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
117 FreePool (NewString);\r
118\r
119 if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
120 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
121 if (NewString == NULL) {\r
122 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
123 return;\r
124 }\r
125 } else {\r
126 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
127 if (NewString == NULL) {\r
128 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
129 return;\r
130 }\r
131 }\r
132 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
133 FreePool (NewString);\r
134\r
135 if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
136 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
137 if (NewString == NULL) {\r
138 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
139 return;\r
140 }\r
141 } else {\r
142 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
143 if (NewString == NULL) {\r
144 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
145 return;\r
146 }\r
a06875e1 147 }\r
9de81c12
ED
148 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
149 FreePool (NewString);\r
a06875e1
ED
150}\r
151\r
a06875e1
ED
152/**\r
153 Install the HII related resources.\r
154\r
155 @retval EFI_SUCCESS Install all the resources success.\r
156 @retval other Error occur when install the resources.\r
157**/\r
158EFI_STATUS\r
159HiiInstall(\r
160 VOID\r
161 )\r
162{\r
163 EFI_STATUS Status;\r
164 EFI_HANDLE DriverHandle;\r
165\r
a06875e1
ED
166 //\r
167 // Clear the global configuration.\r
168 //\r
169 ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration));\r
170\r
171 //\r
172 // Obtain the driver handle that the BIOS assigned us\r
173 //\r
174 DriverHandle = HiiGetDriverImageHandleCB();\r
175\r
176 //\r
177 // Populate the config access protocol with the three functions we are publishing\r
178 //\r
179 gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig;\r
180 gHiiConfigAccessProtocol.RouteConfig = RouteConfig;\r
181 gHiiConfigAccessProtocol.Callback = DriverCallback;\r
182\r
183 //\r
184 // Associate the required protocols with our driver handle\r
185 //\r
186 Status = gBS->InstallMultipleProtocolInterfaces(\r
187 &DriverHandle,\r
188 &gEfiHiiConfigAccessProtocolGuid,\r
189 &gHiiConfigAccessProtocol, // HII callback\r
190 &gEfiDevicePathProtocolGuid,\r
191 &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii\r
192 NULL\r
193 );\r
194\r
195 if (EFI_ERROR(Status)) {\r
196 return Status;\r
197 }\r
198\r
199 return OpalHiiAddPackages();\r
200}\r
201\r
202/**\r
203 Install the HII form and string packages.\r
204\r
205 @retval EFI_SUCCESS Install all the resources success.\r
206 @retval EFI_OUT_OF_RESOURCES Out of resource error.\r
207**/\r
208EFI_STATUS\r
209OpalHiiAddPackages(\r
210 VOID\r
211 )\r
212{\r
213 EFI_HANDLE DriverHandle;\r
214 CHAR16 *NewString;\r
215\r
216 DriverHandle = HiiGetDriverImageHandleCB();\r
217\r
218 //\r
219 // Publish the HII form and HII string packages\r
220 //\r
221 gHiiPackageListHandle = HiiAddPackages(\r
222 &gHiiPackageListGuid,\r
223 DriverHandle,\r
224 OpalPasswordDxeStrings,\r
225 OpalPasswordFormBin,\r
226 (VOID*)NULL\r
227 );\r
228\r
229 //\r
230 // Make sure the packages installed successfully\r
231 //\r
232 if (gHiiPackageListHandle == NULL) {\r
233 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n"));\r
234 return EFI_OUT_OF_RESOURCES;\r
235 }\r
236\r
237 //\r
238 // Update Version String in main window\r
239 //\r
240 NewString = HiiGetDriverNameCB ();\r
241 if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) {\r
242 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n"));\r
243 return EFI_OUT_OF_RESOURCES;\r
244 }\r
245\r
246 return EFI_SUCCESS;\r
247}\r
248\r
249/**\r
250 Uninstall the HII capability.\r
251\r
252 @retval EFI_SUCCESS Uninstall all the resources success.\r
253 @retval others Other errors occur when unistall the hii resource.\r
254**/\r
255EFI_STATUS\r
256HiiUninstall(\r
257 VOID\r
258 )\r
259{\r
260 EFI_STATUS Status;\r
261\r
262 //\r
263 // Remove the packages we've provided to the BIOS\r
264 //\r
265 HiiRemovePackages(gHiiPackageListHandle);\r
266\r
267 //\r
268 // Remove the protocols from our driver handle\r
269 //\r
270 Status = gBS->UninstallMultipleProtocolInterfaces(\r
271 HiiGetDriverImageHandleCB(),\r
272 &gEfiHiiConfigAccessProtocolGuid,\r
273 &gHiiConfigAccessProtocol, // HII callback\r
274 &gEfiDevicePathProtocolGuid,\r
275 &gHiiVendorDevicePath, // required for HII callback\r
276 NULL\r
277 );\r
278 if (EFI_ERROR(Status)) {\r
279 DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status));\r
280 }\r
281\r
282 return Status;\r
283}\r
284\r
285/**\r
286 Updates the main menu form.\r
287\r
288 @retval EFI_SUCCESS update the main form success.\r
289**/\r
290EFI_STATUS\r
291HiiPopulateMainMenuForm (\r
292 VOID\r
293 )\r
294{\r
295 UINT8 Index;\r
296 CHAR8 *DiskName;\r
297 EFI_STRING_ID DiskNameId;\r
298 OPAL_DISK *OpalDisk;\r
299\r
300 HiiSetCurrentConfiguration();\r
301\r
302 gHiiConfiguration.SupportedDisks = 0;\r
303\r
304 for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) {\r
305 OpalDisk = HiiGetOpalDiskCB (Index);\r
306 if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) {\r
307 gHiiConfiguration.SupportedDisks |= (1 << Index);\r
308 DiskNameId = GetDiskNameStringId (Index);\r
309 DiskName = HiiDiskGetNameCB (Index);\r
310 if ((DiskName == NULL) || (DiskNameId == 0)) {\r
311 return EFI_UNSUPPORTED;\r
312 }\r
313 HiiSetFormString(DiskNameId, DiskName);\r
314 }\r
315 }\r
316\r
317 OpalHiiSetBrowserData ();\r
318 return EFI_SUCCESS;\r
319}\r
320\r
321/**\r
322 Update the disk action info.\r
323\r
324 @param ActionString\r
325 @param SelectedAction\r
326\r
327 @retval EFI_SUCCESS Uninstall all the resources success.\r
328**/\r
329EFI_STATUS\r
330HiiSelectDiskAction (\r
331 CHAR8 *ActionString,\r
332 UINT8 SelectedAction\r
333 )\r
334{\r
335 OPAL_DISK *OpalDisk;\r
336 OPAL_DISK_ACTIONS AvailActions;\r
337\r
338 OpalHiiGetBrowserData ();\r
339\r
340 HiiSetFormString(STRING_TOKEN(STR_DISK_ACTION_LBL), ActionString);\r
341 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), " ");\r
342\r
343 gHiiConfiguration.SelectedAction = SelectedAction;\r
344 gHiiConfiguration.AvailableFields = 0;\r
345\r
346 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
347 if (OpalDisk == NULL) {\r
348 return EFI_INVALID_PARAMETER;\r
349 }\r
350\r
351 if (OpalSupportGetAvailableActions (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions) != TcgResultSuccess) {\r
352 return EFI_DEVICE_ERROR;\r
353 }\r
354\r
355 switch (SelectedAction) {\r
356 case HII_KEY_ID_GOTO_LOCK:\r
357 case HII_KEY_ID_GOTO_UNLOCK:\r
358 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
359 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
360 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
361 case HII_KEY_ID_GOTO_DISABLE_USER:\r
362 case HII_KEY_ID_GOTO_ENABLE_FEATURE: // User is required to enter Password to enable Feature\r
363 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
364 break;\r
365\r
366 case HII_KEY_ID_GOTO_PSID_REVERT:\r
367 gHiiConfiguration.AvailableFields |= HII_FIELD_PSID;\r
368 break;\r
369\r
370 case HII_KEY_ID_GOTO_REVERT:\r
371 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
0efc3be0 372 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA;\r
a06875e1
ED
373 if (AvailActions.RevertKeepDataForced) {\r
374 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA_FORCED;\r
375 }\r
376 break;\r
377 }\r
378\r
379 OpalHiiSetBrowserData ();\r
380\r
381 return EFI_SUCCESS;\r
382}\r
383\r
384/**\r
385 Get disk name string id.\r
386\r
387 @param DiskIndex The input disk index info.\r
388\r
389 @retval The disk name string id.\r
390\r
391**/\r
392EFI_STRING_ID\r
393GetDiskNameStringId(\r
394 UINT8 DiskIndex\r
395 )\r
396{\r
397 switch (DiskIndex) {\r
398 case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0);\r
399 case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1);\r
400 case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2);\r
401 case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3);\r
402 case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4);\r
403 case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5);\r
404 }\r
405 return 0;\r
406}\r
407\r
408/**\r
409 This function processes the results of changes in configuration.\r
410\r
411 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
412 @param Action Specifies the type of action taken by the browser.\r
413 @param QuestionId A unique value which is sent to the original\r
414 exporting driver so that it can identify the type\r
415 of data to expect.\r
416 @param Type The type of value for the question.\r
417 @param Value A pointer to the data being sent to the original\r
418 exporting driver.\r
419 @param ActionRequest On return, points to the action requested by the\r
420 callback function.\r
421\r
422 @retval EFI_SUCCESS The callback successfully handled the action.\r
423 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
424 variable and its data.\r
425 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
426 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
427 callback.\r
428\r
429**/\r
430EFI_STATUS\r
431EFIAPI\r
432DriverCallback(\r
b4ddf0eb 433 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
a06875e1
ED
434 EFI_BROWSER_ACTION Action,\r
435 EFI_QUESTION_ID QuestionId,\r
436 UINT8 Type,\r
b4ddf0eb
ED
437 EFI_IFR_TYPE_VALUE *Value,\r
438 EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
a06875e1
ED
439 )\r
440{\r
441 HII_KEY HiiKey;\r
442 UINT8 HiiKeyId;\r
9de81c12 443 UINT32 PpRequest;\r
a06875e1
ED
444\r
445 if (ActionRequest != NULL) {\r
446 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
b4ddf0eb
ED
447 } else {\r
448 return EFI_INVALID_PARAMETER;\r
a06875e1
ED
449 }\r
450\r
451 //\r
452 // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it.\r
453 //\r
454 if ((QuestionId & HII_KEY_FLAG) == 0) {\r
455 return EFI_SUCCESS;\r
456 }\r
457\r
458 HiiKey.Raw = QuestionId;\r
459 HiiKeyId = (UINT8) HiiKey.KeyBits.Id;\r
460\r
461 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
462 switch (HiiKeyId) {\r
463 case HII_KEY_ID_VAR_SUPPORTED_DISKS:\r
464 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n"));\r
465 return HiiPopulateMainMenuForm ();\r
466\r
467 case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS:\r
468 return HiiPopulateDiskInfoForm();\r
469 }\r
470 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
471 switch (HiiKeyId) {\r
472 case HII_KEY_ID_GOTO_DISK_INFO:\r
473 return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);\r
474\r
475 case HII_KEY_ID_GOTO_LOCK:\r
476 return HiiSelectDiskAction("Action: Lock", HiiKeyId);\r
477\r
478 case HII_KEY_ID_GOTO_UNLOCK:\r
479 return HiiSelectDiskAction("Action: Unlock", HiiKeyId);\r
480\r
481 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
482 return HiiSelectDiskAction("Action: Set Administrator Password", HiiKeyId);\r
483\r
484 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
485 return HiiSelectDiskAction("Action: Set User Password", HiiKeyId);\r
486\r
487 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
488 return HiiSelectDiskAction("Action: Secure Erase", HiiKeyId);\r
489\r
490 case HII_KEY_ID_GOTO_PSID_REVERT:\r
491 return HiiSelectDiskAction("Action: Revert to Factory Defaults with PSID", HiiKeyId);\r
492\r
493 case HII_KEY_ID_GOTO_REVERT:\r
494 return HiiSelectDiskAction("Action: Revert to Factory Defaults", HiiKeyId);\r
495\r
496 case HII_KEY_ID_GOTO_DISABLE_USER:\r
497 return HiiSelectDiskAction("Action: Disable User", HiiKeyId);\r
498\r
499 case HII_KEY_ID_GOTO_ENABLE_FEATURE:\r
500 return HiiSelectDiskAction("Action: Enable Feature", HiiKeyId);\r
501\r
502 case HII_KEY_ID_ENTER_PASSWORD:\r
503 return HiiPasswordEntered(Value->string);\r
a06875e1
ED
504 }\r
505 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
506 switch (HiiKeyId) {\r
507 case HII_KEY_ID_ENTER_PSID:\r
508 HiiPsidRevert();\r
509 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
510 return EFI_SUCCESS;\r
8d3d8450
ED
511\r
512 case HII_KEY_ID_BLOCKSID:\r
9de81c12
ED
513 switch (Value->u8) {\r
514 case 0:\r
515 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
516 break;\r
517\r
518 case 1:\r
519 PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
520 break;\r
521\r
522 case 2:\r
523 PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
524 break;\r
525\r
526 case 3:\r
527 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
528 break;\r
529\r
530 case 4:\r
531 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
532 break;\r
533\r
534 case 5:\r
535 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
536 break;\r
537\r
538 case 6:\r
539 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
540 break;\r
541\r
542 default:\r
543 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
544 DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
545 break;\r
546 }\r
547 HiiSetBlockSidAction(PpRequest);\r
548\r
8d3d8450
ED
549 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
550 return EFI_SUCCESS;\r
9de81c12
ED
551\r
552 default:\r
553 break;\r
a06875e1
ED
554 }\r
555 }\r
556\r
557 return EFI_UNSUPPORTED;\r
558}\r
559\r
560/**\r
561 Update the global Disk index info.\r
562\r
563 @param Index The input disk index info.\r
564\r
565 @retval EFI_SUCCESS Update the disk index info success.\r
566\r
567**/\r
568EFI_STATUS\r
569HiiSelectDisk(\r
570 UINT8 Index\r
571 )\r
572{\r
573 OpalHiiGetBrowserData();\r
574 gHiiConfiguration.SelectedDiskIndex = Index;\r
575 OpalHiiSetBrowserData ();\r
576\r
577 return EFI_SUCCESS;\r
578}\r
579\r
580/**\r
581 Draws the disk info form.\r
582\r
583 @retval EFI_SUCCESS Draw the disk info success.\r
584\r
585**/\r
586EFI_STATUS\r
587HiiPopulateDiskInfoForm(\r
588 VOID\r
589 )\r
590{\r
591 OPAL_DISK* OpalDisk;\r
592 OPAL_DISK_ACTIONS AvailActions;\r
593 TCG_RESULT Ret;\r
594 CHAR8 *DiskName;\r
595\r
596 OpalHiiGetBrowserData();\r
597\r
598 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
599 if (DiskName == NULL) {\r
600 return EFI_UNSUPPORTED;\r
601 }\r
602 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
603\r
604 ZeroMem(gHiiConfiguration.Psid, sizeof(gHiiConfiguration.Psid));\r
605\r
606 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
607\r
608 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
609\r
610 if (OpalDisk != NULL) {\r
611 OpalDiskUpdateStatus (OpalDisk);\r
612 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
613 if (Ret == TcgResultSuccess) {\r
614 //\r
615 // Update actions, always allow PSID Revert\r
616 //\r
617 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
618\r
619 //\r
620 // Always allow unlock to handle device migration\r
621 //\r
622 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
623\r
624 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
625 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
626 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
627\r
628 //\r
629 // Update strings\r
630 //\r
631 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
632 } else {\r
633 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
634 }\r
635 } else {\r
636 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
637 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
638 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
639 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
640 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
a06875e1
ED
641\r
642 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
643\r
644 //\r
645 // Determine revert options for disk\r
646 // Default initialize keep user Data to be true\r
647 //\r
648 gHiiConfiguration.KeepUserData = 1;\r
649 }\r
650 }\r
651 }\r
652\r
653 //\r
654 // Pass the current configuration to the BIOS\r
655 //\r
656 OpalHiiSetBrowserData ();\r
657\r
658 return EFI_SUCCESS;\r
659}\r
660\r
661/**\r
662 Reverts the Opal disk to factory default.\r
663\r
664 @retval EFI_SUCCESS Do the required action success.\r
665\r
666**/\r
667EFI_STATUS\r
668HiiPsidRevert(\r
669 VOID\r
670 )\r
671{\r
672 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
673 TCG_PSID Psid;\r
674 OPAL_DISK *OpalDisk;\r
675 TCG_RESULT Ret;\r
676 OPAL_SESSION Session;\r
4636e442 677 UINT8 TmpBuf[PSID_CHARACTER_STRING_END_LENGTH];\r
a06875e1
ED
678\r
679 Ret = TcgResultFailure;\r
680\r
681 OpalHiiGetBrowserData();\r
682\r
4636e442
ED
683 ZeroMem (TmpBuf, sizeof (TmpBuf));\r
684 UnicodeStrToAsciiStrS (gHiiConfiguration.Psid, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\r
685 CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH);\r
a06875e1 686\r
b4ddf0eb 687 OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
a06875e1 688 if (OpalDisk != NULL) {\r
b4ddf0eb
ED
689 ZeroMem(&Session, sizeof(Session));\r
690 Session.Sscp = OpalDisk->Sscp;\r
691 Session.MediaId = OpalDisk->MediaId;\r
692 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
693\r
a06875e1
ED
694 Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
695 }\r
696\r
bee13c00
ED
697 ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH);\r
698\r
a06875e1
ED
699 if (Ret == TcgResultSuccess) {\r
700 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
701 } else {\r
702 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" );\r
703 }\r
704\r
705 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
706\r
707 return EFI_SUCCESS;\r
708}\r
709\r
710/**\r
711 Set password for the disk.\r
712\r
713 @param OpalDisk The disk need to set the password.\r
714 @param Password The input password.\r
715 @param PassLength The input password length.\r
716\r
717 @retval EFI_SUCCESS Do the required action success.\r
718\r
719**/\r
720EFI_STATUS\r
721HiiSetPassword(\r
722 OPAL_DISK *OpalDisk,\r
723 VOID *Password,\r
724 UINT32 PassLength\r
725 )\r
726{\r
727 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
728 TCG_RESULT Ret;\r
729 BOOLEAN ExistingPassword;\r
730 OPAL_SESSION Session;\r
731\r
732 ExistingPassword = FALSE;\r
733\r
734 //\r
735 // PassLength = 0 means check whether exist old password.\r
736 //\r
737 if (PassLength == 0) {\r
738 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
739 gHiiOldPasswordLength = 0;\r
740\r
741 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) {\r
742 ExistingPassword = FALSE;\r
743 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) {\r
744 ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature);\r
745 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
746 //\r
747 // Set user Password option shall only be shown if an Admin Password exists\r
748 // so a Password is always required (Admin or Existing User Password)\r
749 //\r
750 ExistingPassword = TRUE;\r
751 }\r
752\r
753 //\r
754 // Return error if there is a previous Password\r
755 // see UEFI 2.4 errata B, Figure 121. Password Flowchart\r
756 //\r
757 return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
758 }\r
759\r
760 ZeroMem(&Session, sizeof(Session));\r
761 Session.Sscp = OpalDisk->Sscp;\r
762 Session.MediaId = OpalDisk->MediaId;\r
763 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
764\r
765 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure");\r
766 //\r
767 // Password entered.\r
768 // No current Owner, so set new Password, must be admin Password\r
769 //\r
770 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
771 Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath);\r
772 if (Ret == TcgResultSuccess) {\r
773 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
774 }\r
775\r
776 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
777 return EFI_SUCCESS;\r
778 }\r
779\r
780 //\r
781 // 1st Password entered\r
782 //\r
783 if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) {\r
784\r
785 //\r
786 // Unknown ownership - prompt for old Password, then new\r
787 // old Password is not set yet - first time through\r
788 // assume authority provided is admin1, overwritten if user1 authority works below\r
789 //\r
790 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
791 //\r
792 // First try to login as USER1 to Locking SP to see if we're simply updating its Password\r
793 //\r
794 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY);\r
795 if (Ret == TcgResultSuccess) {\r
796 //\r
797 // User1 worked so authority 1 means user 1\r
798 //\r
799 CopyMem(gHiiOldPassword, Password, PassLength);\r
800 gHiiOldPasswordLength = PassLength;\r
801\r
802 return EFI_SUCCESS;\r
803 }\r
804 }\r
805\r
806 //\r
807 // Else try admin1 below\r
808 //\r
809 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY);\r
810 if (Ret == TcgResultSuccess) {\r
811 CopyMem(gHiiOldPassword, Password, PassLength);\r
812 gHiiOldPasswordLength = PassLength;\r
813\r
814 return EFI_SUCCESS;\r
815 } else {\r
816 DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n"));\r
817 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure");\r
818\r
819 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
820 gHiiOldPasswordLength = 0;\r
821\r
822 return EFI_NOT_READY;\r
823 }\r
824 }\r
825\r
826 //\r
827 // New Password entered\r
828 //\r
829 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
830 Ret = OpalSupportSetPassword(\r
831 &Session,\r
832 gHiiOldPassword,\r
833 gHiiOldPasswordLength,\r
834 Password,\r
835 PassLength,\r
836 OpalDisk->OpalDevicePath,\r
837 FALSE\r
838 );\r
839 } else {\r
840 Ret = OpalSupportSetPassword(\r
841 &Session,\r
842 gHiiOldPassword,\r
843 gHiiOldPasswordLength,\r
844 Password,\r
845 PassLength,\r
846 OpalDisk->OpalDevicePath,\r
847 TRUE\r
848 );\r
849 }\r
850\r
851 if (Ret == TcgResultSuccess) {\r
852 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
853 }\r
854\r
855 //\r
856 // Reset old Password storage\r
857 //\r
858 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
859 gHiiOldPasswordLength = 0;\r
860\r
861 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
862 return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY;\r
863}\r
864\r
865/**\r
866 Secure Erases Opal Disk.\r
867\r
868 @param OpalDisk The disk need to erase data.\r
869 @param Password The input password.\r
870 @param PassLength The input password length.\r
871\r
872 @retval EFI_SUCCESS Do the required action success.\r
873\r
874**/\r
875EFI_STATUS\r
876HiiSecureErase(\r
877 OPAL_DISK *OpalDisk,\r
878 const VOID *Password,\r
879 UINT32 PassLength\r
880 )\r
881{\r
882 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
883 BOOLEAN PasswordFailed;\r
884 TCG_RESULT Ret;\r
885 OPAL_SESSION AdminSpSession;\r
886\r
887 if (PassLength == 0) {\r
888 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
889 }\r
890\r
891 ZeroMem(&AdminSpSession, sizeof(AdminSpSession));\r
892 AdminSpSession.Sscp = OpalDisk->Sscp;\r
893 AdminSpSession.MediaId = OpalDisk->MediaId;\r
894 AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId;\r
895\r
896 Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed);\r
897 if (Ret == TcgResultSuccess) {\r
898 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" );\r
899 } else {\r
900 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" );\r
901 }\r
902 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
903\r
904 //\r
905 // If Password failed, return invalid passowrd\r
906 //\r
907 if (PasswordFailed) {\r
908 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
909 return EFI_NOT_READY;\r
910 }\r
911\r
912 //\r
913 // Indicates Password was valid and is not changing to UEFI\r
914 // Response string will indicate action error\r
915 //\r
916 return EFI_DEVICE_ERROR;\r
917}\r
918\r
919\r
920/**\r
921 Disables User for Opal Disk.\r
922\r
923 @param OpalDisk The disk need to the action.\r
924 @param Password The input password.\r
925 @param PassLength The input password length.\r
926\r
927 @retval EFI_SUCCESS Do the required action success.\r
928\r
929**/\r
930EFI_STATUS\r
931HiiDisableUser(\r
932 OPAL_DISK *OpalDisk,\r
933 VOID *Password,\r
934 UINT32 PassLength\r
935 )\r
936{\r
937 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
938 BOOLEAN PasswordFailed;\r
939 TCG_RESULT Ret;\r
940 OPAL_SESSION Session;\r
941\r
942 if (PassLength == 0) {\r
943 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
944 }\r
945\r
946 ZeroMem(&Session, sizeof(Session));\r
947 Session.Sscp = OpalDisk->Sscp;\r
948 Session.MediaId = OpalDisk->MediaId;\r
949 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
950\r
951 Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath);\r
952 if (Ret == TcgResultSuccess) {\r
953 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" );\r
954 } else {\r
955 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" );\r
956 }\r
957 HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response);\r
958\r
959 //\r
960 // If Password failed, return invalid passowrd\r
961 //\r
962 if (PasswordFailed) {\r
963 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
964 return EFI_NOT_READY;\r
965 }\r
966\r
967 //\r
968 // Indicates Password was valid and is not changing to UEFI\r
969 // Response string will indicate action error\r
970 //\r
971 return EFI_DEVICE_ERROR;\r
972}\r
973\r
974/**\r
975 Revert Opal Disk as Admin1.\r
976\r
977 @param OpalDisk The disk need to the action.\r
978 @param Password The input password.\r
979 @param PassLength The input password length.\r
980 @param KeepUserData Whether need to keey user data.\r
981\r
982 @retval EFI_SUCCESS Do the required action success.\r
983\r
984**/\r
985EFI_STATUS\r
986HiiRevert(\r
987 OPAL_DISK *OpalDisk,\r
988 VOID *Password,\r
989 UINT32 PassLength,\r
990 BOOLEAN KeepUserData\r
991 )\r
992{\r
993 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
994 BOOLEAN PasswordFailed;\r
995 TCG_RESULT Ret;\r
996 OPAL_SESSION Session;\r
997\r
998 if (PassLength == 0) {\r
999 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
1000 // return error to indicate there is an existing Password\r
1001 return EFI_DEVICE_ERROR;\r
1002 }\r
1003\r
1004 ZeroMem(&Session, sizeof(Session));\r
1005 Session.Sscp = OpalDisk->Sscp;\r
1006 Session.MediaId = OpalDisk->MediaId;\r
1007 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1008\r
1009 Ret = OpalSupportRevert(\r
1010 &Session,\r
1011 KeepUserData,\r
1012 Password,\r
1013 PassLength,\r
1014 OpalDisk->Msid,\r
1015 OpalDisk->MsidLength,\r
1016 &PasswordFailed,\r
1017 OpalDisk->OpalDevicePath\r
1018 );\r
1019 if (Ret == TcgResultSuccess) {\r
1020 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" );\r
1021 } else {\r
1022 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" );\r
1023 }\r
1024 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1025\r
1026 //\r
1027 // If Password failed, return invalid passowrd\r
1028 //\r
1029 if (PasswordFailed) {\r
1030 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1031 return EFI_NOT_READY;\r
1032 }\r
1033\r
1034 //\r
1035 // Indicates Password was valid and is not changing to UEFI\r
1036 // Response string will indicate action error\r
1037 //\r
1038 return EFI_DEVICE_ERROR;\r
1039}\r
1040\r
1041/**\r
1042 Unlocks Opal Disk.\r
1043\r
1044 @param OpalDisk The disk need to the action.\r
1045 @param Password The input password.\r
1046 @param PassLength The input password length.\r
1047\r
1048 @retval EFI_SUCCESS Do the required action success.\r
1049\r
1050**/\r
1051EFI_STATUS\r
1052HiiUnlock(\r
1053 OPAL_DISK *OpalDisk,\r
1054 VOID *Password,\r
1055 UINT32 PassLength\r
1056 )\r
1057{\r
1058 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
1059 TCG_RESULT Ret;\r
1060 OPAL_SESSION Session;\r
1061\r
1062 if (PassLength == 0) {\r
1063 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
1064 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
1065 }\r
1066\r
1067 ZeroMem(&Session, sizeof(Session));\r
1068 Session.Sscp = OpalDisk->Sscp;\r
1069 Session.MediaId = OpalDisk->MediaId;\r
1070 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1071\r
1072 Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath);\r
1073 if (Ret == TcgResultSuccess) {\r
1074 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" );\r
1075 } else {\r
1076 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" );\r
1077 }\r
1078\r
1079 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1080\r
1081 if (Ret == TcgResultSuccess) {\r
1082 DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n"));\r
1083 return EFI_DEVICE_ERROR;\r
1084 } else {\r
1085 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1086 return EFI_NOT_READY;\r
1087 }\r
1088}\r
1089\r
1090/**\r
1091 Use the input password to do the specified action.\r
1092\r
1093 @param Str The input password saved in.\r
1094\r
1095 @retval EFI_SUCCESS Do the required action success.\r
1096 @retval Others Other error occur.\r
1097\r
1098**/\r
1099EFI_STATUS\r
1100HiiPasswordEntered(\r
1101 EFI_STRING_ID Str\r
1102 )\r
1103{\r
bee13c00
ED
1104 OPAL_DISK* OpalDisk;\r
1105 CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
a06875e1
ED
1106 CHAR16* UniStr;\r
1107 UINT32 PassLength;\r
1108 EFI_STATUS Status;\r
1109\r
1110 OpalHiiGetBrowserData();\r
1111\r
1112 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
1113 if (OpalDisk == NULL) {\r
1114 DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex));\r
1115 return EFI_NOT_FOUND;\r
1116 }\r
1117\r
1118 if (Str == 0) {\r
1119 DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n"));\r
1120 return EFI_INVALID_PARAMETER;\r
1121 }\r
1122\r
1123 ZeroMem(Password, sizeof(Password));\r
1124\r
1125 UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL);\r
1126 if (UniStr == NULL) {\r
1127 return EFI_NOT_FOUND;\r
1128 }\r
bee13c00
ED
1129\r
1130 HiiSetString(gHiiPackageListHandle, Str, L"", NULL);\r
1131\r
a06875e1
ED
1132 PassLength = (UINT32) StrLen (UniStr);\r
1133 if (PassLength >= sizeof(Password)) {\r
1134 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
bee13c00
ED
1135 ZeroMem (UniStr, StrSize (UniStr));\r
1136 FreePool(UniStr);\r
a06875e1
ED
1137 return EFI_BUFFER_TOO_SMALL;\r
1138 }\r
1139\r
b7c71793 1140 UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
bee13c00
ED
1141 ZeroMem (UniStr, StrSize (UniStr));\r
1142 FreePool(UniStr);\r
a06875e1 1143\r
a06875e1
ED
1144 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
1145 Status = HiiUnlock (OpalDisk, Password, PassLength);\r
1146 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) {\r
1147 Status = HiiSecureErase (OpalDisk, Password, PassLength);\r
1148 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
1149 Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
1150 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
0efc3be0
ED
1151 if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
1152 //\r
1153 // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
1154 // So here hardcode a FALSE for this case.\r
1155 //\r
1156 Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
1157 } else {\r
1158 Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
1159 }\r
a06875e1
ED
1160 } else {\r
1161 Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
1162 }\r
1163\r
bee13c00
ED
1164 ZeroMem (Password, sizeof (Password));\r
1165\r
a06875e1
ED
1166 OpalHiiSetBrowserData ();\r
1167\r
1168 return Status;\r
1169}\r
1170\r
1171/**\r
1172 Update block sid info.\r
1173\r
1174 @param Enable Enable/disable BlockSid.\r
1175\r
1176 @retval EFI_SUCCESS Do the required action success.\r
1177 @retval Others Other error occur.\r
1178\r
1179**/\r
1180EFI_STATUS\r
9de81c12
ED
1181HiiSetBlockSidAction (\r
1182 IN UINT32 PpRequest\r
a06875e1
ED
1183 )\r
1184{\r
9de81c12
ED
1185 UINT32 ReturnCode;\r
1186 EFI_STATUS Status;\r
1187\r
1188 //\r
1189 // Process TCG Physical Presence request just after trusted console is ready\r
1190 // Platform can connect trusted consoles and then call the below function.\r
1191 //\r
1192 ReturnCode = TcgPhysicalPresenceStorageLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
1193 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
1194 Status = EFI_SUCCESS;\r
1195 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
1196 Status = EFI_OUT_OF_RESOURCES;\r
1197 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
1198 Status = EFI_UNSUPPORTED;\r
1199 } else {\r
1200 Status = EFI_DEVICE_ERROR;\r
1201 }\r
a06875e1
ED
1202\r
1203 return Status;\r
1204}\r
1205\r
1206/**\r
1207 This function processes the results of changes in configuration.\r
1208\r
1209 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1210 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
1211 format.\r
1212 @param Progress A pointer to a string filled in with the offset of\r
1213 the most recent '&' before the first failing\r
1214 name/value pair (or the beginning of the string if\r
1215 the failure is in the first name/value pair) or\r
1216 the terminating NULL if all was successful.\r
1217\r
1218 @retval EFI_SUCCESS The Results is processed successfully.\r
1219 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
1220 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1221 driver.\r
1222\r
1223**/\r
1224EFI_STATUS\r
1225EFIAPI\r
1226RouteConfig(\r
1227 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1228 CONST EFI_STRING Configuration,\r
1229 EFI_STRING *Progress\r
1230 )\r
1231{\r
a06875e1
ED
1232 if (Configuration == NULL || Progress == NULL) {\r
1233 return (EFI_INVALID_PARAMETER);\r
1234 }\r
1235\r
eafbd7a2
DB
1236 *Progress = Configuration;\r
1237 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1238 return EFI_NOT_FOUND;\r
1239 }\r
1240\r
1241 *Progress = Configuration + StrLen (Configuration);\r
1242\r
a06875e1
ED
1243 return EFI_SUCCESS;\r
1244}\r
1245\r
1246/**\r
1247 This function allows a caller to extract the current configuration for one\r
1248 or more named elements from the target driver.\r
1249\r
1250 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1251 @param Request A null-terminated Unicode string in\r
1252 <ConfigRequest> format.\r
1253 @param Progress On return, points to a character in the Request\r
1254 string. Points to the string's null terminator if\r
1255 request was successful. Points to the most recent\r
1256 '&' before the first failing name/value pair (or\r
1257 the beginning of the string if the failure is in\r
1258 the first name/value pair) if the request was not\r
1259 successful.\r
1260 @param Results A null-terminated Unicode string in\r
1261 <ConfigAltResp> format which has all values filled\r
1262 in for the names in the Request string. String to\r
1263 be allocated by the called function.\r
1264\r
1265 @retval EFI_SUCCESS The Results is filled with the requested values.\r
1266 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
1267 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
1268 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1269 driver.\r
1270\r
1271**/\r
1272EFI_STATUS\r
1273EFIAPI\r
1274ExtractConfig(\r
1275 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1276 CONST EFI_STRING Request,\r
1277 EFI_STRING *Progress,\r
1278 EFI_STRING *Results\r
1279 )\r
1280{\r
1281 EFI_STATUS Status;\r
1282\r
a06875e1
ED
1283 //\r
1284 // Check for valid parameters\r
1285 //\r
1286 if (Progress == NULL || Results == NULL) {\r
1287 return (EFI_INVALID_PARAMETER);\r
1288 }\r
1289\r
eafbd7a2
DB
1290 *Progress = Request;\r
1291 if ((Request != NULL) &&\r
1292 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1293 return EFI_NOT_FOUND;\r
1294 }\r
1295\r
a06875e1
ED
1296 //\r
1297 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1298 //\r
1299 Status = gHiiConfigRouting->BlockToConfig(\r
1300 gHiiConfigRouting,\r
1301 Request,\r
1302 (UINT8*)&gHiiConfiguration,\r
1303 sizeof(OPAL_HII_CONFIGURATION),\r
1304 Results,\r
1305 Progress\r
1306 );\r
1307\r
1308 return (Status);\r
1309}\r
1310\r
1311\r
1312/**\r
1313\r
1314 Pass the current system state to the bios via the hii_G_Configuration.\r
1315\r
1316**/\r
1317VOID\r
1318OpalHiiSetBrowserData (\r
1319 VOID\r
1320 )\r
1321{\r
a06875e1
ED
1322 HiiSetBrowserData(\r
1323 &gHiiSetupVariableGuid,\r
1324 (CHAR16*)L"OpalHiiConfig",\r
1325 sizeof(gHiiConfiguration),\r
1326 (UINT8*)&gHiiConfiguration,\r
1327 NULL\r
1328 );\r
1329}\r
1330\r
1331\r
1332/**\r
1333\r
1334 Populate the hii_g_Configuraton with the browser Data.\r
1335\r
1336**/\r
1337VOID\r
1338OpalHiiGetBrowserData (\r
1339 VOID\r
1340 )\r
1341{\r
a06875e1
ED
1342 HiiGetBrowserData(\r
1343 &gHiiSetupVariableGuid,\r
1344 (CHAR16*)L"OpalHiiConfig",\r
1345 sizeof(gHiiConfiguration),\r
1346 (UINT8*)&gHiiConfiguration\r
1347 );\r
1348}\r
1349\r
1350/**\r
1351 Set a string Value in a form.\r
1352\r
1353 @param DestStringId The stringid which need to update.\r
1354 @param SrcAsciiStr The string nned to update.\r
1355\r
1356 @retval EFI_SUCCESS Do the required action success.\r
1357 @retval Others Other error occur.\r
1358\r
1359**/\r
1360EFI_STATUS\r
1361HiiSetFormString(\r
1362 EFI_STRING_ID DestStringId,\r
1363 CHAR8 *SrcAsciiStr\r
1364 )\r
1365{\r
1366 UINT32 Len;\r
1367 UINT32 UniSize;\r
1368 CHAR16* UniStr;\r
1369\r
a06875e1
ED
1370 //\r
1371 // Determine the Length of the sting\r
1372 //\r
1373 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1374\r
1375 //\r
1376 // Allocate space for the unicode string, including terminator\r
1377 //\r
1378 UniSize = (Len + 1) * sizeof(CHAR16);\r
1379 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1380\r
1381 //\r
1382 // Copy into unicode string, then copy into string id\r
1383 //\r
b7c71793 1384 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
a06875e1
ED
1385\r
1386 //\r
1387 // Update the string in the form\r
1388 //\r
1389 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1390 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1391 FreePool(UniStr);\r
1392 return (EFI_OUT_OF_RESOURCES);\r
1393 }\r
1394\r
1395 //\r
1396 // Free the memory\r
1397 //\r
1398 FreePool(UniStr);\r
1399\r
1400 return (EFI_SUCCESS);\r
1401}\r
1402\r
1403/**\r
1404 Initialize the Opal disk base on the hardware info get from device.\r
1405\r
1406 @param Dev The Opal device.\r
1407\r
1408 @retval EFI_SUCESS Initialize the device success.\r
1409 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1410\r
1411**/\r
1412EFI_STATUS\r
1413OpalDiskInitialize (\r
1414 IN OPAL_DRIVER_DEVICE *Dev\r
1415 )\r
1416{\r
1417 TCG_RESULT TcgResult;\r
1418 OPAL_SESSION Session;\r
1419\r
1420 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1421 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1422 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1423 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1424\r
1425 ZeroMem(&Session, sizeof(Session));\r
1426 Session.Sscp = Dev->Sscp;\r
1427 Session.MediaId = Dev->MediaId;\r
1428\r
1429 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1430 if (TcgResult != TcgResultSuccess) {\r
1431 return EFI_DEVICE_ERROR;\r
1432 }\r
1433 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1434\r
1435 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1436 if (TcgResult != TcgResultSuccess) {\r
1437 return EFI_DEVICE_ERROR;\r
1438 }\r
1439\r
1440 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1441}\r
1442\r
1443/**\r
1444 Update the device info.\r
1445\r
1446 @param OpalDisk The Opal device.\r
1447\r
1448 @retval EFI_SUCESS Initialize the device success.\r
1449 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1450 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1451\r
1452**/\r
1453EFI_STATUS\r
1454OpalDiskUpdateStatus (\r
1455 OPAL_DISK *OpalDisk\r
1456 )\r
1457{\r
1458 TCG_RESULT TcgResult;\r
1459 OPAL_SESSION Session;\r
1460\r
1461 ZeroMem(&Session, sizeof(Session));\r
1462 Session.Sscp = OpalDisk->Sscp;\r
1463 Session.MediaId = OpalDisk->MediaId;\r
1464 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1465\r
1466 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1467 if (TcgResult != TcgResultSuccess) {\r
1468 return EFI_DEVICE_ERROR;\r
1469 }\r
1470\r
1471 if (OpalDisk->MsidLength == 0) {\r
1472 return EFI_INVALID_PARAMETER;\r
1473 } else {\r
1474 //\r
1475 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1476 //\r
1477 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1478 }\r
1479\r
1480 return EFI_SUCCESS;\r
1481}\r
1482\r