]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg OpalPasswordDxe: Use PP actions to enable BlockSID.
[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
697 if (Ret == TcgResultSuccess) {\r
698 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
699 } else {\r
700 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" );\r
701 }\r
702\r
703 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
704\r
705 return EFI_SUCCESS;\r
706}\r
707\r
708/**\r
709 Set password for the disk.\r
710\r
711 @param OpalDisk The disk need to set the password.\r
712 @param Password The input password.\r
713 @param PassLength The input password length.\r
714\r
715 @retval EFI_SUCCESS Do the required action success.\r
716\r
717**/\r
718EFI_STATUS\r
719HiiSetPassword(\r
720 OPAL_DISK *OpalDisk,\r
721 VOID *Password,\r
722 UINT32 PassLength\r
723 )\r
724{\r
725 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
726 TCG_RESULT Ret;\r
727 BOOLEAN ExistingPassword;\r
728 OPAL_SESSION Session;\r
729\r
730 ExistingPassword = FALSE;\r
731\r
732 //\r
733 // PassLength = 0 means check whether exist old password.\r
734 //\r
735 if (PassLength == 0) {\r
736 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
737 gHiiOldPasswordLength = 0;\r
738\r
739 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) {\r
740 ExistingPassword = FALSE;\r
741 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) {\r
742 ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature);\r
743 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
744 //\r
745 // Set user Password option shall only be shown if an Admin Password exists\r
746 // so a Password is always required (Admin or Existing User Password)\r
747 //\r
748 ExistingPassword = TRUE;\r
749 }\r
750\r
751 //\r
752 // Return error if there is a previous Password\r
753 // see UEFI 2.4 errata B, Figure 121. Password Flowchart\r
754 //\r
755 return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
756 }\r
757\r
758 ZeroMem(&Session, sizeof(Session));\r
759 Session.Sscp = OpalDisk->Sscp;\r
760 Session.MediaId = OpalDisk->MediaId;\r
761 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
762\r
763 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure");\r
764 //\r
765 // Password entered.\r
766 // No current Owner, so set new Password, must be admin Password\r
767 //\r
768 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
769 Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath);\r
770 if (Ret == TcgResultSuccess) {\r
771 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
772 }\r
773\r
774 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
775 return EFI_SUCCESS;\r
776 }\r
777\r
778 //\r
779 // 1st Password entered\r
780 //\r
781 if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) {\r
782\r
783 //\r
784 // Unknown ownership - prompt for old Password, then new\r
785 // old Password is not set yet - first time through\r
786 // assume authority provided is admin1, overwritten if user1 authority works below\r
787 //\r
788 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
789 //\r
790 // First try to login as USER1 to Locking SP to see if we're simply updating its Password\r
791 //\r
792 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY);\r
793 if (Ret == TcgResultSuccess) {\r
794 //\r
795 // User1 worked so authority 1 means user 1\r
796 //\r
797 CopyMem(gHiiOldPassword, Password, PassLength);\r
798 gHiiOldPasswordLength = PassLength;\r
799\r
800 return EFI_SUCCESS;\r
801 }\r
802 }\r
803\r
804 //\r
805 // Else try admin1 below\r
806 //\r
807 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY);\r
808 if (Ret == TcgResultSuccess) {\r
809 CopyMem(gHiiOldPassword, Password, PassLength);\r
810 gHiiOldPasswordLength = PassLength;\r
811\r
812 return EFI_SUCCESS;\r
813 } else {\r
814 DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n"));\r
815 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure");\r
816\r
817 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
818 gHiiOldPasswordLength = 0;\r
819\r
820 return EFI_NOT_READY;\r
821 }\r
822 }\r
823\r
824 //\r
825 // New Password entered\r
826 //\r
827 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
828 Ret = OpalSupportSetPassword(\r
829 &Session,\r
830 gHiiOldPassword,\r
831 gHiiOldPasswordLength,\r
832 Password,\r
833 PassLength,\r
834 OpalDisk->OpalDevicePath,\r
835 FALSE\r
836 );\r
837 } else {\r
838 Ret = OpalSupportSetPassword(\r
839 &Session,\r
840 gHiiOldPassword,\r
841 gHiiOldPasswordLength,\r
842 Password,\r
843 PassLength,\r
844 OpalDisk->OpalDevicePath,\r
845 TRUE\r
846 );\r
847 }\r
848\r
849 if (Ret == TcgResultSuccess) {\r
850 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
851 }\r
852\r
853 //\r
854 // Reset old Password storage\r
855 //\r
856 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
857 gHiiOldPasswordLength = 0;\r
858\r
859 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
860 return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY;\r
861}\r
862\r
863/**\r
864 Secure Erases Opal Disk.\r
865\r
866 @param OpalDisk The disk need to erase data.\r
867 @param Password The input password.\r
868 @param PassLength The input password length.\r
869\r
870 @retval EFI_SUCCESS Do the required action success.\r
871\r
872**/\r
873EFI_STATUS\r
874HiiSecureErase(\r
875 OPAL_DISK *OpalDisk,\r
876 const VOID *Password,\r
877 UINT32 PassLength\r
878 )\r
879{\r
880 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
881 BOOLEAN PasswordFailed;\r
882 TCG_RESULT Ret;\r
883 OPAL_SESSION AdminSpSession;\r
884\r
885 if (PassLength == 0) {\r
886 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
887 }\r
888\r
889 ZeroMem(&AdminSpSession, sizeof(AdminSpSession));\r
890 AdminSpSession.Sscp = OpalDisk->Sscp;\r
891 AdminSpSession.MediaId = OpalDisk->MediaId;\r
892 AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId;\r
893\r
894 Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed);\r
895 if (Ret == TcgResultSuccess) {\r
896 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" );\r
897 } else {\r
898 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" );\r
899 }\r
900 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
901\r
902 //\r
903 // If Password failed, return invalid passowrd\r
904 //\r
905 if (PasswordFailed) {\r
906 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
907 return EFI_NOT_READY;\r
908 }\r
909\r
910 //\r
911 // Indicates Password was valid and is not changing to UEFI\r
912 // Response string will indicate action error\r
913 //\r
914 return EFI_DEVICE_ERROR;\r
915}\r
916\r
917\r
918/**\r
919 Disables User for Opal Disk.\r
920\r
921 @param OpalDisk The disk need to the action.\r
922 @param Password The input password.\r
923 @param PassLength The input password length.\r
924\r
925 @retval EFI_SUCCESS Do the required action success.\r
926\r
927**/\r
928EFI_STATUS\r
929HiiDisableUser(\r
930 OPAL_DISK *OpalDisk,\r
931 VOID *Password,\r
932 UINT32 PassLength\r
933 )\r
934{\r
935 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
936 BOOLEAN PasswordFailed;\r
937 TCG_RESULT Ret;\r
938 OPAL_SESSION Session;\r
939\r
940 if (PassLength == 0) {\r
941 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
942 }\r
943\r
944 ZeroMem(&Session, sizeof(Session));\r
945 Session.Sscp = OpalDisk->Sscp;\r
946 Session.MediaId = OpalDisk->MediaId;\r
947 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
948\r
949 Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath);\r
950 if (Ret == TcgResultSuccess) {\r
951 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" );\r
952 } else {\r
953 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" );\r
954 }\r
955 HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response);\r
956\r
957 //\r
958 // If Password failed, return invalid passowrd\r
959 //\r
960 if (PasswordFailed) {\r
961 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
962 return EFI_NOT_READY;\r
963 }\r
964\r
965 //\r
966 // Indicates Password was valid and is not changing to UEFI\r
967 // Response string will indicate action error\r
968 //\r
969 return EFI_DEVICE_ERROR;\r
970}\r
971\r
972/**\r
973 Revert Opal Disk as Admin1.\r
974\r
975 @param OpalDisk The disk need to the action.\r
976 @param Password The input password.\r
977 @param PassLength The input password length.\r
978 @param KeepUserData Whether need to keey user data.\r
979\r
980 @retval EFI_SUCCESS Do the required action success.\r
981\r
982**/\r
983EFI_STATUS\r
984HiiRevert(\r
985 OPAL_DISK *OpalDisk,\r
986 VOID *Password,\r
987 UINT32 PassLength,\r
988 BOOLEAN KeepUserData\r
989 )\r
990{\r
991 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
992 BOOLEAN PasswordFailed;\r
993 TCG_RESULT Ret;\r
994 OPAL_SESSION Session;\r
995\r
996 if (PassLength == 0) {\r
997 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
998 // return error to indicate there is an existing Password\r
999 return EFI_DEVICE_ERROR;\r
1000 }\r
1001\r
1002 ZeroMem(&Session, sizeof(Session));\r
1003 Session.Sscp = OpalDisk->Sscp;\r
1004 Session.MediaId = OpalDisk->MediaId;\r
1005 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1006\r
1007 Ret = OpalSupportRevert(\r
1008 &Session,\r
1009 KeepUserData,\r
1010 Password,\r
1011 PassLength,\r
1012 OpalDisk->Msid,\r
1013 OpalDisk->MsidLength,\r
1014 &PasswordFailed,\r
1015 OpalDisk->OpalDevicePath\r
1016 );\r
1017 if (Ret == TcgResultSuccess) {\r
1018 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" );\r
1019 } else {\r
1020 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" );\r
1021 }\r
1022 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1023\r
1024 //\r
1025 // If Password failed, return invalid passowrd\r
1026 //\r
1027 if (PasswordFailed) {\r
1028 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1029 return EFI_NOT_READY;\r
1030 }\r
1031\r
1032 //\r
1033 // Indicates Password was valid and is not changing to UEFI\r
1034 // Response string will indicate action error\r
1035 //\r
1036 return EFI_DEVICE_ERROR;\r
1037}\r
1038\r
1039/**\r
1040 Unlocks Opal Disk.\r
1041\r
1042 @param OpalDisk The disk need to the action.\r
1043 @param Password The input password.\r
1044 @param PassLength The input password length.\r
1045\r
1046 @retval EFI_SUCCESS Do the required action success.\r
1047\r
1048**/\r
1049EFI_STATUS\r
1050HiiUnlock(\r
1051 OPAL_DISK *OpalDisk,\r
1052 VOID *Password,\r
1053 UINT32 PassLength\r
1054 )\r
1055{\r
1056 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
1057 TCG_RESULT Ret;\r
1058 OPAL_SESSION Session;\r
1059\r
1060 if (PassLength == 0) {\r
1061 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
1062 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
1063 }\r
1064\r
1065 ZeroMem(&Session, sizeof(Session));\r
1066 Session.Sscp = OpalDisk->Sscp;\r
1067 Session.MediaId = OpalDisk->MediaId;\r
1068 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1069\r
1070 Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath);\r
1071 if (Ret == TcgResultSuccess) {\r
1072 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" );\r
1073 } else {\r
1074 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" );\r
1075 }\r
1076\r
1077 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1078\r
1079 if (Ret == TcgResultSuccess) {\r
1080 DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n"));\r
1081 return EFI_DEVICE_ERROR;\r
1082 } else {\r
1083 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1084 return EFI_NOT_READY;\r
1085 }\r
1086}\r
1087\r
1088/**\r
1089 Use the input password to do the specified action.\r
1090\r
1091 @param Str The input password saved in.\r
1092\r
1093 @retval EFI_SUCCESS Do the required action success.\r
1094 @retval Others Other error occur.\r
1095\r
1096**/\r
1097EFI_STATUS\r
1098HiiPasswordEntered(\r
1099 EFI_STRING_ID Str\r
1100 )\r
1101{\r
1102 OPAL_DISK* OpalDisk;\r
1103 CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
1104 CHAR16* UniStr;\r
1105 UINT32 PassLength;\r
1106 EFI_STATUS Status;\r
1107\r
1108 OpalHiiGetBrowserData();\r
1109\r
1110 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
1111 if (OpalDisk == NULL) {\r
1112 DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex));\r
1113 return EFI_NOT_FOUND;\r
1114 }\r
1115\r
1116 if (Str == 0) {\r
1117 DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n"));\r
1118 return EFI_INVALID_PARAMETER;\r
1119 }\r
1120\r
1121 ZeroMem(Password, sizeof(Password));\r
1122\r
1123 UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL);\r
1124 if (UniStr == NULL) {\r
1125 return EFI_NOT_FOUND;\r
1126 }\r
1127 PassLength = (UINT32) StrLen (UniStr);\r
1128 if (PassLength >= sizeof(Password)) {\r
1129 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
1130 gBS->FreePool(UniStr);\r
1131 return EFI_BUFFER_TOO_SMALL;\r
1132 }\r
1133\r
b7c71793 1134 UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
a06875e1
ED
1135 gBS->FreePool(UniStr);\r
1136\r
a06875e1
ED
1137 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
1138 Status = HiiUnlock (OpalDisk, Password, PassLength);\r
1139 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) {\r
1140 Status = HiiSecureErase (OpalDisk, Password, PassLength);\r
1141 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
1142 Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
1143 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
0efc3be0
ED
1144 if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
1145 //\r
1146 // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
1147 // So here hardcode a FALSE for this case.\r
1148 //\r
1149 Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
1150 } else {\r
1151 Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
1152 }\r
a06875e1
ED
1153 } else {\r
1154 Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
1155 }\r
1156\r
1157 OpalHiiSetBrowserData ();\r
1158\r
1159 return Status;\r
1160}\r
1161\r
1162/**\r
1163 Update block sid info.\r
1164\r
1165 @param Enable Enable/disable BlockSid.\r
1166\r
1167 @retval EFI_SUCCESS Do the required action success.\r
1168 @retval Others Other error occur.\r
1169\r
1170**/\r
1171EFI_STATUS\r
9de81c12
ED
1172HiiSetBlockSidAction (\r
1173 IN UINT32 PpRequest\r
a06875e1
ED
1174 )\r
1175{\r
9de81c12
ED
1176 UINT32 ReturnCode;\r
1177 EFI_STATUS Status;\r
1178\r
1179 //\r
1180 // Process TCG Physical Presence request just after trusted console is ready\r
1181 // Platform can connect trusted consoles and then call the below function.\r
1182 //\r
1183 ReturnCode = TcgPhysicalPresenceStorageLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
1184 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
1185 Status = EFI_SUCCESS;\r
1186 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
1187 Status = EFI_OUT_OF_RESOURCES;\r
1188 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
1189 Status = EFI_UNSUPPORTED;\r
1190 } else {\r
1191 Status = EFI_DEVICE_ERROR;\r
1192 }\r
a06875e1
ED
1193\r
1194 return Status;\r
1195}\r
1196\r
1197/**\r
1198 This function processes the results of changes in configuration.\r
1199\r
1200 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1201 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
1202 format.\r
1203 @param Progress A pointer to a string filled in with the offset of\r
1204 the most recent '&' before the first failing\r
1205 name/value pair (or the beginning of the string if\r
1206 the failure is in the first name/value pair) or\r
1207 the terminating NULL if all was successful.\r
1208\r
1209 @retval EFI_SUCCESS The Results is processed successfully.\r
1210 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
1211 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1212 driver.\r
1213\r
1214**/\r
1215EFI_STATUS\r
1216EFIAPI\r
1217RouteConfig(\r
1218 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1219 CONST EFI_STRING Configuration,\r
1220 EFI_STRING *Progress\r
1221 )\r
1222{\r
a06875e1
ED
1223 if (Configuration == NULL || Progress == NULL) {\r
1224 return (EFI_INVALID_PARAMETER);\r
1225 }\r
1226\r
eafbd7a2
DB
1227 *Progress = Configuration;\r
1228 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1229 return EFI_NOT_FOUND;\r
1230 }\r
1231\r
1232 *Progress = Configuration + StrLen (Configuration);\r
1233\r
a06875e1
ED
1234 return EFI_SUCCESS;\r
1235}\r
1236\r
1237/**\r
1238 This function allows a caller to extract the current configuration for one\r
1239 or more named elements from the target driver.\r
1240\r
1241 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1242 @param Request A null-terminated Unicode string in\r
1243 <ConfigRequest> format.\r
1244 @param Progress On return, points to a character in the Request\r
1245 string. Points to the string's null terminator if\r
1246 request was successful. Points to the most recent\r
1247 '&' before the first failing name/value pair (or\r
1248 the beginning of the string if the failure is in\r
1249 the first name/value pair) if the request was not\r
1250 successful.\r
1251 @param Results A null-terminated Unicode string in\r
1252 <ConfigAltResp> format which has all values filled\r
1253 in for the names in the Request string. String to\r
1254 be allocated by the called function.\r
1255\r
1256 @retval EFI_SUCCESS The Results is filled with the requested values.\r
1257 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
1258 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
1259 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1260 driver.\r
1261\r
1262**/\r
1263EFI_STATUS\r
1264EFIAPI\r
1265ExtractConfig(\r
1266 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1267 CONST EFI_STRING Request,\r
1268 EFI_STRING *Progress,\r
1269 EFI_STRING *Results\r
1270 )\r
1271{\r
1272 EFI_STATUS Status;\r
1273\r
a06875e1
ED
1274 //\r
1275 // Check for valid parameters\r
1276 //\r
1277 if (Progress == NULL || Results == NULL) {\r
1278 return (EFI_INVALID_PARAMETER);\r
1279 }\r
1280\r
eafbd7a2
DB
1281 *Progress = Request;\r
1282 if ((Request != NULL) &&\r
1283 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1284 return EFI_NOT_FOUND;\r
1285 }\r
1286\r
a06875e1
ED
1287 //\r
1288 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1289 //\r
1290 Status = gHiiConfigRouting->BlockToConfig(\r
1291 gHiiConfigRouting,\r
1292 Request,\r
1293 (UINT8*)&gHiiConfiguration,\r
1294 sizeof(OPAL_HII_CONFIGURATION),\r
1295 Results,\r
1296 Progress\r
1297 );\r
1298\r
1299 return (Status);\r
1300}\r
1301\r
1302\r
1303/**\r
1304\r
1305 Pass the current system state to the bios via the hii_G_Configuration.\r
1306\r
1307**/\r
1308VOID\r
1309OpalHiiSetBrowserData (\r
1310 VOID\r
1311 )\r
1312{\r
a06875e1
ED
1313 HiiSetBrowserData(\r
1314 &gHiiSetupVariableGuid,\r
1315 (CHAR16*)L"OpalHiiConfig",\r
1316 sizeof(gHiiConfiguration),\r
1317 (UINT8*)&gHiiConfiguration,\r
1318 NULL\r
1319 );\r
1320}\r
1321\r
1322\r
1323/**\r
1324\r
1325 Populate the hii_g_Configuraton with the browser Data.\r
1326\r
1327**/\r
1328VOID\r
1329OpalHiiGetBrowserData (\r
1330 VOID\r
1331 )\r
1332{\r
a06875e1
ED
1333 HiiGetBrowserData(\r
1334 &gHiiSetupVariableGuid,\r
1335 (CHAR16*)L"OpalHiiConfig",\r
1336 sizeof(gHiiConfiguration),\r
1337 (UINT8*)&gHiiConfiguration\r
1338 );\r
1339}\r
1340\r
1341/**\r
1342 Set a string Value in a form.\r
1343\r
1344 @param DestStringId The stringid which need to update.\r
1345 @param SrcAsciiStr The string nned to update.\r
1346\r
1347 @retval EFI_SUCCESS Do the required action success.\r
1348 @retval Others Other error occur.\r
1349\r
1350**/\r
1351EFI_STATUS\r
1352HiiSetFormString(\r
1353 EFI_STRING_ID DestStringId,\r
1354 CHAR8 *SrcAsciiStr\r
1355 )\r
1356{\r
1357 UINT32 Len;\r
1358 UINT32 UniSize;\r
1359 CHAR16* UniStr;\r
1360\r
a06875e1
ED
1361 //\r
1362 // Determine the Length of the sting\r
1363 //\r
1364 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1365\r
1366 //\r
1367 // Allocate space for the unicode string, including terminator\r
1368 //\r
1369 UniSize = (Len + 1) * sizeof(CHAR16);\r
1370 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1371\r
1372 //\r
1373 // Copy into unicode string, then copy into string id\r
1374 //\r
b7c71793 1375 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
a06875e1
ED
1376\r
1377 //\r
1378 // Update the string in the form\r
1379 //\r
1380 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1381 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1382 FreePool(UniStr);\r
1383 return (EFI_OUT_OF_RESOURCES);\r
1384 }\r
1385\r
1386 //\r
1387 // Free the memory\r
1388 //\r
1389 FreePool(UniStr);\r
1390\r
1391 return (EFI_SUCCESS);\r
1392}\r
1393\r
1394/**\r
1395 Initialize the Opal disk base on the hardware info get from device.\r
1396\r
1397 @param Dev The Opal device.\r
1398\r
1399 @retval EFI_SUCESS Initialize the device success.\r
1400 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1401\r
1402**/\r
1403EFI_STATUS\r
1404OpalDiskInitialize (\r
1405 IN OPAL_DRIVER_DEVICE *Dev\r
1406 )\r
1407{\r
1408 TCG_RESULT TcgResult;\r
1409 OPAL_SESSION Session;\r
1410\r
1411 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1412 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1413 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1414 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1415\r
1416 ZeroMem(&Session, sizeof(Session));\r
1417 Session.Sscp = Dev->Sscp;\r
1418 Session.MediaId = Dev->MediaId;\r
1419\r
1420 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1421 if (TcgResult != TcgResultSuccess) {\r
1422 return EFI_DEVICE_ERROR;\r
1423 }\r
1424 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1425\r
1426 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1427 if (TcgResult != TcgResultSuccess) {\r
1428 return EFI_DEVICE_ERROR;\r
1429 }\r
1430\r
1431 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1432}\r
1433\r
1434/**\r
1435 Update the device info.\r
1436\r
1437 @param OpalDisk The Opal device.\r
1438\r
1439 @retval EFI_SUCESS Initialize the device success.\r
1440 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1441 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1442\r
1443**/\r
1444EFI_STATUS\r
1445OpalDiskUpdateStatus (\r
1446 OPAL_DISK *OpalDisk\r
1447 )\r
1448{\r
1449 TCG_RESULT TcgResult;\r
1450 OPAL_SESSION Session;\r
1451\r
1452 ZeroMem(&Session, sizeof(Session));\r
1453 Session.Sscp = OpalDisk->Sscp;\r
1454 Session.MediaId = OpalDisk->MediaId;\r
1455 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1456\r
1457 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1458 if (TcgResult != TcgResultSuccess) {\r
1459 return EFI_DEVICE_ERROR;\r
1460 }\r
1461\r
1462 if (OpalDisk->MsidLength == 0) {\r
1463 return EFI_INVALID_PARAMETER;\r
1464 } else {\r
1465 //\r
1466 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1467 //\r
1468 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1469 }\r
1470\r
1471 return EFI_SUCCESS;\r
1472}\r
1473\r