]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg OpalPassword: Add solution without SMM device code
[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
34c2ce65
ED
93 UINT32 PpStorageFlag;\r
94 EFI_STRING NewString;\r
a06875e1
ED
95\r
96 gHiiConfiguration.NumDisks = GetDeviceCount();\r
97\r
34c2ce65
ED
98 //\r
99 // Update the BlockSID status string.\r
100 //\r
101 PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
102\r
103 if ((PpStorageFlag & TCG2_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 & TCG2_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
a06875e1 131 }\r
34c2ce65
ED
132 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
133 FreePool (NewString);\r
134\r
135 if ((PpStorageFlag & TCG2_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
147 }\r
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
34c2ce65 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
01dd0773
ED
504\r
505 case HII_KEY_ID_ENTER_PSID:\r
506 return HiiPsidRevert(Value->string);\r
507\r
a06875e1
ED
508 }\r
509 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
510 switch (HiiKeyId) {\r
8d3d8450 511 case HII_KEY_ID_BLOCKSID:\r
34c2ce65
ED
512 switch (Value->u8) {\r
513 case 0:\r
514 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
515 break;\r
516\r
517 case 1:\r
518 PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
519 break;\r
520\r
521 case 2:\r
522 PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
523 break;\r
524\r
525 case 3:\r
526 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
527 break;\r
528\r
529 case 4:\r
530 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
531 break;\r
532\r
533 case 5:\r
534 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
535 break;\r
536\r
537 case 6:\r
538 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
539 break;\r
540\r
541 default:\r
542 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
543 DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
544 break;\r
545 }\r
546 HiiSetBlockSidAction(PpRequest);\r
547\r
8d3d8450
ED
548 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
549 return EFI_SUCCESS;\r
34c2ce65
ED
550\r
551 default:\r
552 break;\r
a06875e1
ED
553 }\r
554 }\r
555\r
556 return EFI_UNSUPPORTED;\r
557}\r
558\r
559/**\r
560 Update the global Disk index info.\r
561\r
562 @param Index The input disk index info.\r
563\r
564 @retval EFI_SUCCESS Update the disk index info success.\r
565\r
566**/\r
567EFI_STATUS\r
568HiiSelectDisk(\r
569 UINT8 Index\r
570 )\r
571{\r
572 OpalHiiGetBrowserData();\r
573 gHiiConfiguration.SelectedDiskIndex = Index;\r
574 OpalHiiSetBrowserData ();\r
575\r
576 return EFI_SUCCESS;\r
577}\r
578\r
579/**\r
580 Draws the disk info form.\r
581\r
582 @retval EFI_SUCCESS Draw the disk info success.\r
583\r
584**/\r
585EFI_STATUS\r
586HiiPopulateDiskInfoForm(\r
587 VOID\r
588 )\r
589{\r
590 OPAL_DISK* OpalDisk;\r
591 OPAL_DISK_ACTIONS AvailActions;\r
592 TCG_RESULT Ret;\r
593 CHAR8 *DiskName;\r
594\r
595 OpalHiiGetBrowserData();\r
596\r
597 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
598 if (DiskName == NULL) {\r
599 return EFI_UNSUPPORTED;\r
600 }\r
601 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
602\r
603 ZeroMem(gHiiConfiguration.Psid, sizeof(gHiiConfiguration.Psid));\r
604\r
605 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
606\r
607 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
608\r
609 if (OpalDisk != NULL) {\r
610 OpalDiskUpdateStatus (OpalDisk);\r
611 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
612 if (Ret == TcgResultSuccess) {\r
613 //\r
614 // Update actions, always allow PSID Revert\r
615 //\r
616 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
617\r
618 //\r
619 // Always allow unlock to handle device migration\r
620 //\r
621 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
622\r
623 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
624 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
625 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
626\r
627 //\r
628 // Update strings\r
629 //\r
630 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
631 } else {\r
632 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
633 }\r
634 } else {\r
635 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
636 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
637 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
638 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
639 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
a06875e1
ED
640\r
641 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
642\r
643 //\r
644 // Determine revert options for disk\r
645 // Default initialize keep user Data to be true\r
646 //\r
647 gHiiConfiguration.KeepUserData = 1;\r
648 }\r
649 }\r
650 }\r
651\r
652 //\r
653 // Pass the current configuration to the BIOS\r
654 //\r
655 OpalHiiSetBrowserData ();\r
656\r
657 return EFI_SUCCESS;\r
658}\r
659\r
660/**\r
661 Reverts the Opal disk to factory default.\r
662\r
01dd0773
ED
663 @param PsidStringId The string id for the PSID info.\r
664\r
a06875e1
ED
665 @retval EFI_SUCCESS Do the required action success.\r
666\r
667**/\r
668EFI_STATUS\r
669HiiPsidRevert(\r
01dd0773 670 EFI_STRING_ID PsidStringId\r
a06875e1
ED
671 )\r
672{\r
673 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
674 TCG_PSID Psid;\r
675 OPAL_DISK *OpalDisk;\r
676 TCG_RESULT Ret;\r
677 OPAL_SESSION Session;\r
01dd0773 678 CHAR16 *UnicodeStr;\r
4636e442 679 UINT8 TmpBuf[PSID_CHARACTER_STRING_END_LENGTH];\r
a06875e1
ED
680\r
681 Ret = TcgResultFailure;\r
682\r
01dd0773 683 UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL);\r
4636e442 684 ZeroMem (TmpBuf, sizeof (TmpBuf));\r
01dd0773 685 UnicodeStrToAsciiStrS (UnicodeStr, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\r
4636e442 686 CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH);\r
01dd0773
ED
687 HiiSetString (gHiiPackageListHandle, PsidStringId, L"", NULL);\r
688 ZeroMem (TmpBuf, sizeof (TmpBuf));\r
689 ZeroMem (UnicodeStr, StrSize (UnicodeStr));\r
690 FreePool (UnicodeStr);\r
a06875e1 691\r
b4ddf0eb 692 OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
a06875e1 693 if (OpalDisk != NULL) {\r
b4ddf0eb
ED
694 ZeroMem(&Session, sizeof(Session));\r
695 Session.Sscp = OpalDisk->Sscp;\r
696 Session.MediaId = OpalDisk->MediaId;\r
697 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
698\r
a06875e1
ED
699 Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
700 }\r
701\r
bee13c00
ED
702 ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH);\r
703\r
a06875e1
ED
704 if (Ret == TcgResultSuccess) {\r
705 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
706 } else {\r
707 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" );\r
708 }\r
709\r
710 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
711\r
712 return EFI_SUCCESS;\r
713}\r
714\r
715/**\r
716 Set password for the disk.\r
717\r
718 @param OpalDisk The disk need to set the password.\r
719 @param Password The input password.\r
720 @param PassLength The input password length.\r
721\r
722 @retval EFI_SUCCESS Do the required action success.\r
723\r
724**/\r
725EFI_STATUS\r
726HiiSetPassword(\r
727 OPAL_DISK *OpalDisk,\r
728 VOID *Password,\r
729 UINT32 PassLength\r
730 )\r
731{\r
732 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
733 TCG_RESULT Ret;\r
734 BOOLEAN ExistingPassword;\r
735 OPAL_SESSION Session;\r
736\r
737 ExistingPassword = FALSE;\r
738\r
739 //\r
740 // PassLength = 0 means check whether exist old password.\r
741 //\r
742 if (PassLength == 0) {\r
743 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
744 gHiiOldPasswordLength = 0;\r
745\r
746 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) {\r
747 ExistingPassword = FALSE;\r
748 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) {\r
749 ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature);\r
750 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
751 //\r
752 // Set user Password option shall only be shown if an Admin Password exists\r
753 // so a Password is always required (Admin or Existing User Password)\r
754 //\r
755 ExistingPassword = TRUE;\r
756 }\r
757\r
758 //\r
759 // Return error if there is a previous Password\r
760 // see UEFI 2.4 errata B, Figure 121. Password Flowchart\r
761 //\r
762 return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
763 }\r
764\r
765 ZeroMem(&Session, sizeof(Session));\r
766 Session.Sscp = OpalDisk->Sscp;\r
767 Session.MediaId = OpalDisk->MediaId;\r
768 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
769\r
770 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure");\r
771 //\r
772 // Password entered.\r
773 // No current Owner, so set new Password, must be admin Password\r
774 //\r
775 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
776 Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath);\r
777 if (Ret == TcgResultSuccess) {\r
778 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
779 }\r
780\r
781 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
782 return EFI_SUCCESS;\r
783 }\r
784\r
785 //\r
786 // 1st Password entered\r
787 //\r
788 if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) {\r
789\r
790 //\r
791 // Unknown ownership - prompt for old Password, then new\r
792 // old Password is not set yet - first time through\r
793 // assume authority provided is admin1, overwritten if user1 authority works below\r
794 //\r
795 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
796 //\r
797 // First try to login as USER1 to Locking SP to see if we're simply updating its Password\r
798 //\r
799 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY);\r
800 if (Ret == TcgResultSuccess) {\r
801 //\r
802 // User1 worked so authority 1 means user 1\r
803 //\r
804 CopyMem(gHiiOldPassword, Password, PassLength);\r
805 gHiiOldPasswordLength = PassLength;\r
806\r
807 return EFI_SUCCESS;\r
808 }\r
809 }\r
810\r
811 //\r
812 // Else try admin1 below\r
813 //\r
814 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY);\r
815 if (Ret == TcgResultSuccess) {\r
816 CopyMem(gHiiOldPassword, Password, PassLength);\r
817 gHiiOldPasswordLength = PassLength;\r
818\r
819 return EFI_SUCCESS;\r
820 } else {\r
821 DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n"));\r
822 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure");\r
823\r
824 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
825 gHiiOldPasswordLength = 0;\r
826\r
827 return EFI_NOT_READY;\r
828 }\r
829 }\r
830\r
831 //\r
832 // New Password entered\r
833 //\r
834 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
835 Ret = OpalSupportSetPassword(\r
836 &Session,\r
837 gHiiOldPassword,\r
838 gHiiOldPasswordLength,\r
839 Password,\r
840 PassLength,\r
841 OpalDisk->OpalDevicePath,\r
842 FALSE\r
843 );\r
844 } else {\r
845 Ret = OpalSupportSetPassword(\r
846 &Session,\r
847 gHiiOldPassword,\r
848 gHiiOldPasswordLength,\r
849 Password,\r
850 PassLength,\r
851 OpalDisk->OpalDevicePath,\r
852 TRUE\r
853 );\r
854 }\r
855\r
856 if (Ret == TcgResultSuccess) {\r
857 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
858 }\r
859\r
860 //\r
861 // Reset old Password storage\r
862 //\r
863 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
864 gHiiOldPasswordLength = 0;\r
865\r
866 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
867 return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY;\r
868}\r
869\r
870/**\r
871 Secure Erases Opal Disk.\r
872\r
873 @param OpalDisk The disk need to erase data.\r
874 @param Password The input password.\r
875 @param PassLength The input password length.\r
876\r
877 @retval EFI_SUCCESS Do the required action success.\r
878\r
879**/\r
880EFI_STATUS\r
881HiiSecureErase(\r
882 OPAL_DISK *OpalDisk,\r
883 const VOID *Password,\r
884 UINT32 PassLength\r
885 )\r
886{\r
887 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
888 BOOLEAN PasswordFailed;\r
889 TCG_RESULT Ret;\r
890 OPAL_SESSION AdminSpSession;\r
891\r
892 if (PassLength == 0) {\r
893 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
894 }\r
895\r
896 ZeroMem(&AdminSpSession, sizeof(AdminSpSession));\r
897 AdminSpSession.Sscp = OpalDisk->Sscp;\r
898 AdminSpSession.MediaId = OpalDisk->MediaId;\r
899 AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId;\r
900\r
901 Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed);\r
902 if (Ret == TcgResultSuccess) {\r
903 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" );\r
904 } else {\r
905 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" );\r
906 }\r
907 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
908\r
909 //\r
910 // If Password failed, return invalid passowrd\r
911 //\r
912 if (PasswordFailed) {\r
913 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
914 return EFI_NOT_READY;\r
915 }\r
916\r
917 //\r
918 // Indicates Password was valid and is not changing to UEFI\r
919 // Response string will indicate action error\r
920 //\r
921 return EFI_DEVICE_ERROR;\r
922}\r
923\r
924\r
925/**\r
926 Disables User for Opal Disk.\r
927\r
928 @param OpalDisk The disk need to the action.\r
929 @param Password The input password.\r
930 @param PassLength The input password length.\r
931\r
932 @retval EFI_SUCCESS Do the required action success.\r
933\r
934**/\r
935EFI_STATUS\r
936HiiDisableUser(\r
937 OPAL_DISK *OpalDisk,\r
938 VOID *Password,\r
939 UINT32 PassLength\r
940 )\r
941{\r
942 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
943 BOOLEAN PasswordFailed;\r
944 TCG_RESULT Ret;\r
945 OPAL_SESSION Session;\r
946\r
947 if (PassLength == 0) {\r
948 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
949 }\r
950\r
951 ZeroMem(&Session, sizeof(Session));\r
952 Session.Sscp = OpalDisk->Sscp;\r
953 Session.MediaId = OpalDisk->MediaId;\r
954 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
955\r
956 Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath);\r
957 if (Ret == TcgResultSuccess) {\r
958 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" );\r
959 } else {\r
960 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" );\r
961 }\r
962 HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response);\r
963\r
964 //\r
965 // If Password failed, return invalid passowrd\r
966 //\r
967 if (PasswordFailed) {\r
968 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
969 return EFI_NOT_READY;\r
970 }\r
971\r
972 //\r
973 // Indicates Password was valid and is not changing to UEFI\r
974 // Response string will indicate action error\r
975 //\r
976 return EFI_DEVICE_ERROR;\r
977}\r
978\r
979/**\r
980 Revert Opal Disk as Admin1.\r
981\r
982 @param OpalDisk The disk need to the action.\r
983 @param Password The input password.\r
984 @param PassLength The input password length.\r
985 @param KeepUserData Whether need to keey user data.\r
986\r
987 @retval EFI_SUCCESS Do the required action success.\r
988\r
989**/\r
990EFI_STATUS\r
991HiiRevert(\r
992 OPAL_DISK *OpalDisk,\r
993 VOID *Password,\r
994 UINT32 PassLength,\r
995 BOOLEAN KeepUserData\r
996 )\r
997{\r
998 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
999 BOOLEAN PasswordFailed;\r
1000 TCG_RESULT Ret;\r
1001 OPAL_SESSION Session;\r
1002\r
1003 if (PassLength == 0) {\r
1004 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
1005 // return error to indicate there is an existing Password\r
1006 return EFI_DEVICE_ERROR;\r
1007 }\r
1008\r
1009 ZeroMem(&Session, sizeof(Session));\r
1010 Session.Sscp = OpalDisk->Sscp;\r
1011 Session.MediaId = OpalDisk->MediaId;\r
1012 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1013\r
1014 Ret = OpalSupportRevert(\r
1015 &Session,\r
1016 KeepUserData,\r
1017 Password,\r
1018 PassLength,\r
1019 OpalDisk->Msid,\r
1020 OpalDisk->MsidLength,\r
1021 &PasswordFailed,\r
1022 OpalDisk->OpalDevicePath\r
1023 );\r
1024 if (Ret == TcgResultSuccess) {\r
1025 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" );\r
1026 } else {\r
1027 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" );\r
1028 }\r
1029 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1030\r
1031 //\r
1032 // If Password failed, return invalid passowrd\r
1033 //\r
1034 if (PasswordFailed) {\r
1035 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1036 return EFI_NOT_READY;\r
1037 }\r
1038\r
1039 //\r
1040 // Indicates Password was valid and is not changing to UEFI\r
1041 // Response string will indicate action error\r
1042 //\r
1043 return EFI_DEVICE_ERROR;\r
1044}\r
1045\r
1046/**\r
1047 Unlocks Opal Disk.\r
1048\r
1049 @param OpalDisk The disk need to the action.\r
1050 @param Password The input password.\r
1051 @param PassLength The input password length.\r
1052\r
1053 @retval EFI_SUCCESS Do the required action success.\r
1054\r
1055**/\r
1056EFI_STATUS\r
1057HiiUnlock(\r
1058 OPAL_DISK *OpalDisk,\r
1059 VOID *Password,\r
1060 UINT32 PassLength\r
1061 )\r
1062{\r
1063 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
1064 TCG_RESULT Ret;\r
1065 OPAL_SESSION Session;\r
1066\r
1067 if (PassLength == 0) {\r
1068 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
1069 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
1070 }\r
1071\r
1072 ZeroMem(&Session, sizeof(Session));\r
1073 Session.Sscp = OpalDisk->Sscp;\r
1074 Session.MediaId = OpalDisk->MediaId;\r
1075 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1076\r
1077 Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath);\r
1078 if (Ret == TcgResultSuccess) {\r
1079 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" );\r
1080 } else {\r
1081 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" );\r
1082 }\r
1083\r
1084 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1085\r
1086 if (Ret == TcgResultSuccess) {\r
1087 DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n"));\r
1088 return EFI_DEVICE_ERROR;\r
1089 } else {\r
1090 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1091 return EFI_NOT_READY;\r
1092 }\r
1093}\r
1094\r
1095/**\r
1096 Use the input password to do the specified action.\r
1097\r
1098 @param Str The input password saved in.\r
1099\r
1100 @retval EFI_SUCCESS Do the required action success.\r
1101 @retval Others Other error occur.\r
1102\r
1103**/\r
1104EFI_STATUS\r
1105HiiPasswordEntered(\r
1106 EFI_STRING_ID Str\r
1107 )\r
1108{\r
bee13c00
ED
1109 OPAL_DISK* OpalDisk;\r
1110 CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
a06875e1
ED
1111 CHAR16* UniStr;\r
1112 UINT32 PassLength;\r
1113 EFI_STATUS Status;\r
1114\r
1115 OpalHiiGetBrowserData();\r
1116\r
1117 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
1118 if (OpalDisk == NULL) {\r
1119 DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex));\r
1120 return EFI_NOT_FOUND;\r
1121 }\r
1122\r
1123 if (Str == 0) {\r
1124 DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n"));\r
1125 return EFI_INVALID_PARAMETER;\r
1126 }\r
1127\r
1128 ZeroMem(Password, sizeof(Password));\r
1129\r
1130 UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL);\r
1131 if (UniStr == NULL) {\r
1132 return EFI_NOT_FOUND;\r
1133 }\r
bee13c00
ED
1134\r
1135 HiiSetString(gHiiPackageListHandle, Str, L"", NULL);\r
1136\r
a06875e1
ED
1137 PassLength = (UINT32) StrLen (UniStr);\r
1138 if (PassLength >= sizeof(Password)) {\r
1139 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
bee13c00
ED
1140 ZeroMem (UniStr, StrSize (UniStr));\r
1141 FreePool(UniStr);\r
a06875e1
ED
1142 return EFI_BUFFER_TOO_SMALL;\r
1143 }\r
1144\r
b7c71793 1145 UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
bee13c00
ED
1146 ZeroMem (UniStr, StrSize (UniStr));\r
1147 FreePool(UniStr);\r
a06875e1 1148\r
a06875e1
ED
1149 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
1150 Status = HiiUnlock (OpalDisk, Password, PassLength);\r
1151 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) {\r
1152 Status = HiiSecureErase (OpalDisk, Password, PassLength);\r
1153 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
1154 Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
1155 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
0efc3be0
ED
1156 if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
1157 //\r
1158 // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
1159 // So here hardcode a FALSE for this case.\r
1160 //\r
1161 Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
1162 } else {\r
1163 Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
1164 }\r
a06875e1
ED
1165 } else {\r
1166 Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
1167 }\r
1168\r
bee13c00
ED
1169 ZeroMem (Password, sizeof (Password));\r
1170\r
a06875e1
ED
1171 OpalHiiSetBrowserData ();\r
1172\r
1173 return Status;\r
1174}\r
1175\r
1176/**\r
26f75805 1177 Send BlockSid request through TPM physical presence module.\r
a06875e1 1178\r
26f75805 1179 @param PpRequest TPM physical presence operation request.\r
a06875e1
ED
1180\r
1181 @retval EFI_SUCCESS Do the required action success.\r
1182 @retval Others Other error occur.\r
1183\r
1184**/\r
1185EFI_STATUS\r
34c2ce65
ED
1186HiiSetBlockSidAction (\r
1187 IN UINT32 PpRequest\r
a06875e1
ED
1188 )\r
1189{\r
34c2ce65
ED
1190 UINT32 ReturnCode;\r
1191 EFI_STATUS Status;\r
1192\r
1193 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
1194 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
1195 Status = EFI_SUCCESS;\r
1196 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
1197 Status = EFI_OUT_OF_RESOURCES;\r
1198 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
1199 Status = EFI_UNSUPPORTED;\r
1200 } else {\r
1201 Status = EFI_DEVICE_ERROR;\r
1202 }\r
a06875e1
ED
1203\r
1204 return Status;\r
1205}\r
1206\r
1207/**\r
1208 This function processes the results of changes in configuration.\r
1209\r
1210 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1211 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
1212 format.\r
1213 @param Progress A pointer to a string filled in with the offset of\r
1214 the most recent '&' before the first failing\r
1215 name/value pair (or the beginning of the string if\r
1216 the failure is in the first name/value pair) or\r
1217 the terminating NULL if all was successful.\r
1218\r
1219 @retval EFI_SUCCESS The Results is processed successfully.\r
1220 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
1221 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1222 driver.\r
1223\r
1224**/\r
1225EFI_STATUS\r
1226EFIAPI\r
1227RouteConfig(\r
1228 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1229 CONST EFI_STRING Configuration,\r
1230 EFI_STRING *Progress\r
1231 )\r
1232{\r
a06875e1
ED
1233 if (Configuration == NULL || Progress == NULL) {\r
1234 return (EFI_INVALID_PARAMETER);\r
1235 }\r
1236\r
eafbd7a2
DB
1237 *Progress = Configuration;\r
1238 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1239 return EFI_NOT_FOUND;\r
1240 }\r
1241\r
1242 *Progress = Configuration + StrLen (Configuration);\r
1243\r
a06875e1
ED
1244 return EFI_SUCCESS;\r
1245}\r
1246\r
1247/**\r
1248 This function allows a caller to extract the current configuration for one\r
1249 or more named elements from the target driver.\r
1250\r
1251 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1252 @param Request A null-terminated Unicode string in\r
1253 <ConfigRequest> format.\r
1254 @param Progress On return, points to a character in the Request\r
1255 string. Points to the string's null terminator if\r
1256 request was successful. Points to the most recent\r
1257 '&' before the first failing name/value pair (or\r
1258 the beginning of the string if the failure is in\r
1259 the first name/value pair) if the request was not\r
1260 successful.\r
1261 @param Results A null-terminated Unicode string in\r
1262 <ConfigAltResp> format which has all values filled\r
1263 in for the names in the Request string. String to\r
1264 be allocated by the called function.\r
1265\r
1266 @retval EFI_SUCCESS The Results is filled with the requested values.\r
1267 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
1268 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
1269 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1270 driver.\r
1271\r
1272**/\r
1273EFI_STATUS\r
1274EFIAPI\r
1275ExtractConfig(\r
1276 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1277 CONST EFI_STRING Request,\r
1278 EFI_STRING *Progress,\r
1279 EFI_STRING *Results\r
1280 )\r
1281{\r
1282 EFI_STATUS Status;\r
5f2b325e
DB
1283 EFI_STRING ConfigRequest;\r
1284 EFI_STRING ConfigRequestHdr;\r
1285 UINTN BufferSize;\r
1286 UINTN Size;\r
1287 BOOLEAN AllocatedRequest;\r
1288 EFI_HANDLE DriverHandle;\r
a06875e1 1289\r
a06875e1
ED
1290 //\r
1291 // Check for valid parameters\r
1292 //\r
1293 if (Progress == NULL || Results == NULL) {\r
1294 return (EFI_INVALID_PARAMETER);\r
1295 }\r
1296\r
eafbd7a2
DB
1297 *Progress = Request;\r
1298 if ((Request != NULL) &&\r
1299 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1300 return EFI_NOT_FOUND;\r
1301 }\r
1302\r
5f2b325e
DB
1303 AllocatedRequest = FALSE;\r
1304 BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
1305 ConfigRequest = Request;\r
1306 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
1307 //\r
1308 // Request has no request element, construct full request string.\r
1309 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
1310 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
1311 //\r
1312 DriverHandle = HiiGetDriverImageHandleCB();\r
1313 ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
1314 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
1315 ConfigRequest = AllocateZeroPool (Size);\r
1316 if (ConfigRequest == NULL) {\r
1317 return EFI_OUT_OF_RESOURCES;\r
1318 }\r
1319 AllocatedRequest = TRUE;\r
1320 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
1321 FreePool (ConfigRequestHdr);\r
1322 }\r
1323\r
a06875e1
ED
1324 //\r
1325 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1326 //\r
1327 Status = gHiiConfigRouting->BlockToConfig(\r
1328 gHiiConfigRouting,\r
5f2b325e 1329 ConfigRequest,\r
a06875e1
ED
1330 (UINT8*)&gHiiConfiguration,\r
1331 sizeof(OPAL_HII_CONFIGURATION),\r
1332 Results,\r
1333 Progress\r
1334 );\r
1335\r
5f2b325e
DB
1336 //\r
1337 // Free the allocated config request string.\r
1338 //\r
1339 if (AllocatedRequest) {\r
1340 FreePool (ConfigRequest);\r
1341 ConfigRequest = NULL;\r
1342 }\r
1343\r
1344 //\r
1345 // Set Progress string to the original request string.\r
1346 //\r
1347 if (Request == NULL) {\r
1348 *Progress = NULL;\r
1349 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
1350 *Progress = Request + StrLen (Request);\r
1351 }\r
1352\r
a06875e1
ED
1353 return (Status);\r
1354}\r
1355\r
1356\r
1357/**\r
1358\r
1359 Pass the current system state to the bios via the hii_G_Configuration.\r
1360\r
1361**/\r
1362VOID\r
1363OpalHiiSetBrowserData (\r
1364 VOID\r
1365 )\r
1366{\r
a06875e1
ED
1367 HiiSetBrowserData(\r
1368 &gHiiSetupVariableGuid,\r
1369 (CHAR16*)L"OpalHiiConfig",\r
1370 sizeof(gHiiConfiguration),\r
1371 (UINT8*)&gHiiConfiguration,\r
1372 NULL\r
1373 );\r
1374}\r
1375\r
1376\r
1377/**\r
1378\r
1379 Populate the hii_g_Configuraton with the browser Data.\r
1380\r
1381**/\r
1382VOID\r
1383OpalHiiGetBrowserData (\r
1384 VOID\r
1385 )\r
1386{\r
a06875e1
ED
1387 HiiGetBrowserData(\r
1388 &gHiiSetupVariableGuid,\r
1389 (CHAR16*)L"OpalHiiConfig",\r
1390 sizeof(gHiiConfiguration),\r
1391 (UINT8*)&gHiiConfiguration\r
1392 );\r
1393}\r
1394\r
1395/**\r
1396 Set a string Value in a form.\r
1397\r
1398 @param DestStringId The stringid which need to update.\r
1399 @param SrcAsciiStr The string nned to update.\r
1400\r
1401 @retval EFI_SUCCESS Do the required action success.\r
1402 @retval Others Other error occur.\r
1403\r
1404**/\r
1405EFI_STATUS\r
1406HiiSetFormString(\r
1407 EFI_STRING_ID DestStringId,\r
1408 CHAR8 *SrcAsciiStr\r
1409 )\r
1410{\r
1411 UINT32 Len;\r
1412 UINT32 UniSize;\r
1413 CHAR16* UniStr;\r
1414\r
a06875e1
ED
1415 //\r
1416 // Determine the Length of the sting\r
1417 //\r
1418 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1419\r
1420 //\r
1421 // Allocate space for the unicode string, including terminator\r
1422 //\r
1423 UniSize = (Len + 1) * sizeof(CHAR16);\r
1424 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1425\r
1426 //\r
1427 // Copy into unicode string, then copy into string id\r
1428 //\r
b7c71793 1429 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
a06875e1
ED
1430\r
1431 //\r
1432 // Update the string in the form\r
1433 //\r
1434 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1435 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1436 FreePool(UniStr);\r
1437 return (EFI_OUT_OF_RESOURCES);\r
1438 }\r
1439\r
1440 //\r
1441 // Free the memory\r
1442 //\r
1443 FreePool(UniStr);\r
1444\r
1445 return (EFI_SUCCESS);\r
1446}\r
1447\r
1448/**\r
1449 Initialize the Opal disk base on the hardware info get from device.\r
1450\r
1451 @param Dev The Opal device.\r
1452\r
1453 @retval EFI_SUCESS Initialize the device success.\r
1454 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1455\r
1456**/\r
1457EFI_STATUS\r
1458OpalDiskInitialize (\r
1459 IN OPAL_DRIVER_DEVICE *Dev\r
1460 )\r
1461{\r
1462 TCG_RESULT TcgResult;\r
1463 OPAL_SESSION Session;\r
1464\r
1465 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1466 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1467 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1468 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1469\r
1470 ZeroMem(&Session, sizeof(Session));\r
1471 Session.Sscp = Dev->Sscp;\r
1472 Session.MediaId = Dev->MediaId;\r
1473\r
1474 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1475 if (TcgResult != TcgResultSuccess) {\r
1476 return EFI_DEVICE_ERROR;\r
1477 }\r
1478 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1479\r
1480 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1481 if (TcgResult != TcgResultSuccess) {\r
1482 return EFI_DEVICE_ERROR;\r
1483 }\r
1484\r
1485 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1486}\r
1487\r
1488/**\r
1489 Update the device info.\r
1490\r
1491 @param OpalDisk The Opal device.\r
1492\r
1493 @retval EFI_SUCESS Initialize the device success.\r
1494 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1495 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1496\r
1497**/\r
1498EFI_STATUS\r
1499OpalDiskUpdateStatus (\r
1500 OPAL_DISK *OpalDisk\r
1501 )\r
1502{\r
1503 TCG_RESULT TcgResult;\r
1504 OPAL_SESSION Session;\r
1505\r
1506 ZeroMem(&Session, sizeof(Session));\r
1507 Session.Sscp = OpalDisk->Sscp;\r
1508 Session.MediaId = OpalDisk->MediaId;\r
1509 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1510\r
1511 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1512 if (TcgResult != TcgResultSuccess) {\r
1513 return EFI_DEVICE_ERROR;\r
1514 }\r
1515\r
1516 if (OpalDisk->MsidLength == 0) {\r
1517 return EFI_INVALID_PARAMETER;\r
1518 } else {\r
1519 //\r
1520 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1521 //\r
1522 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1523 }\r
1524\r
1525 return EFI_SUCCESS;\r
1526}\r
1527\r