return EFI_SUCCESS;\r
}\r
\r
-\r
-/**\r
- Encode the password using a simple algorithm.\r
-\r
- @param Password The string to be encoded.\r
- @param MaxSize The size of the string.\r
-\r
-**/\r
-VOID\r
-EncodePassword (\r
- IN CHAR16 *Password,\r
- IN UINTN MaxSize\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Loop;\r
- CHAR16 *Buffer;\r
- CHAR16 *Key;\r
-\r
- Key = L"MAR10648567";\r
- Buffer = AllocateZeroPool (MaxSize);\r
- ASSERT (Buffer != NULL);\r
-\r
- for (Index = 0; Key[Index] != 0; Index++) {\r
- for (Loop = 0; Loop < (UINT8) (MaxSize / 2); Loop++) {\r
- Buffer[Loop] = (CHAR16) (Password[Loop] ^ Key[Index]);\r
- }\r
- }\r
-\r
- CopyMem (Password, Buffer, MaxSize);\r
-\r
- FreePool (Buffer);\r
- return ;\r
-}\r
-\r
-/**\r
- Validate the user's password.\r
-\r
- @param PrivateData This driver's private context data.\r
- @param StringId The user's input.\r
-\r
- @retval EFI_SUCCESS The user's input matches the password.\r
- @retval EFI_NOT_READY The user's input does not match the password.\r
-**/\r
-EFI_STATUS\r
-ValidatePassword (\r
- IN DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
- IN EFI_STRING_ID StringId\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN BufferSize;\r
- UINTN PasswordMaxSize;\r
- CHAR16 *Password;\r
- CHAR16 *EncodedPassword;\r
- BOOLEAN OldPassword;\r
-\r
- //\r
- // Get encoded password first\r
- //\r
- BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
- Status = gRT->GetVariable (\r
- VariableName,\r
- &gDriverSampleFormSetGuid,\r
- NULL,\r
- &BufferSize,\r
- &PrivateData->Configuration\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Old password not exist, prompt for new password\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- OldPassword = FALSE;\r
- PasswordMaxSize = sizeof (PrivateData->Configuration.WhatIsThePassword2);\r
- //\r
- // Check whether we have any old password set\r
- //\r
- for (Index = 0; Index < PasswordMaxSize / sizeof (UINT16); Index++) {\r
- if (PrivateData->Configuration.WhatIsThePassword2[Index] != 0) {\r
- OldPassword = TRUE;\r
- break;\r
- }\r
- }\r
- if (!OldPassword) {\r
- //\r
- // Old password not exist, return EFI_SUCCESS to prompt for new password\r
- //\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Get user input password\r
- //\r
- Password = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL);\r
- if (Password == NULL) {\r
- return EFI_NOT_READY;\r
- }\r
- if (StrSize (Password) > PasswordMaxSize) {\r
- FreePool (Password);\r
- return EFI_NOT_READY;\r
- }\r
-\r
- //\r
- // Validate old password\r
- //\r
- EncodedPassword = AllocateZeroPool (PasswordMaxSize);\r
- ASSERT (EncodedPassword != NULL);\r
- StrnCpyS (EncodedPassword, PasswordMaxSize / sizeof (CHAR16), Password, StrLen (Password));\r
- EncodePassword (EncodedPassword, StrLen (EncodedPassword) * sizeof (CHAR16));\r
- if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, PasswordMaxSize) != 0) {\r
- //\r
- // Old password mismatch, return EFI_NOT_READY to prompt for error message\r
- //\r
- Status = EFI_NOT_READY;\r
- } else {\r
- Status = EFI_SUCCESS;\r
- }\r
-\r
- FreePool (Password);\r
- FreePool (EncodedPassword);\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Encode the password using a simple algorithm.\r
-\r
- @param PrivateData This driver's private context data.\r
- @param StringId The password from User.\r
-\r
- @retval EFI_SUCESS The operation is successful.\r
- @return Other value if gRT->SetVariable () fails.\r
-\r
-**/\r
-EFI_STATUS\r
-SetPassword (\r
- IN DRIVER_SAMPLE_PRIVATE_DATA *PrivateData,\r
- IN EFI_STRING_ID StringId\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 *Password;\r
- CHAR16 *TempPassword;\r
- UINTN PasswordSize;\r
- DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
- UINTN BufferSize;\r
-\r
- //\r
- // Get Buffer Storage data from EFI variable\r
- //\r
- BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
- Status = gRT->GetVariable (\r
- VariableName,\r
- &gDriverSampleFormSetGuid,\r
- NULL,\r
- &BufferSize,\r
- &PrivateData->Configuration\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Get user input password\r
- //\r
- Password = PrivateData->Configuration.WhatIsThePassword2;\r
- PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2);\r
- ZeroMem (Password, PasswordSize);\r
-\r
- TempPassword = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL);\r
- if (TempPassword == NULL) {\r
- return EFI_NOT_READY;\r
- }\r
- if (StrSize (TempPassword) > PasswordSize) {\r
- FreePool (TempPassword);\r
- return EFI_NOT_READY;\r
- }\r
- StrnCpyS (Password, PasswordSize / sizeof (CHAR16), TempPassword, StrLen (TempPassword));\r
- FreePool (TempPassword);\r
-\r
- //\r
- // Retrieve uncommitted data from Browser\r
- //\r
- Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
- ASSERT (Configuration != NULL);\r
- if (HiiGetBrowserData (&gDriverSampleFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) {\r
- //\r
- // Update password's clear text in the screen\r
- //\r
- CopyMem (Configuration->PasswordClearText, Password, StrSize (Password));\r
-\r
- //\r
- // Update uncommitted data of Browser\r
- //\r
- HiiSetBrowserData (\r
- &gDriverSampleFormSetGuid,\r
- VariableName,\r
- sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
- (UINT8 *) Configuration,\r
- NULL\r
- );\r
- }\r
-\r
- //\r
- // Free Configuration Buffer\r
- //\r
- FreePool (Configuration);\r
-\r
-\r
- //\r
- // Set password\r
- //\r
- EncodePassword (Password, StrLen (Password) * 2);\r
- Status = gRT->SetVariable(\r
- VariableName,\r
- &gDriverSampleFormSetGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
- &PrivateData->Configuration\r
- );\r
- return Status;\r
-}\r
-\r
/**\r
Update names of Name/Value storage to current language.\r
\r
HiiFreeOpCodeHandle (EndOpCodeHandle);\r
break;\r
\r
- case 0x2000:\r
- //\r
- // Only used to update the state.\r
- //\r
- if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0) && \r
- (PrivateData->PasswordState == BROWSER_STATE_SET_PASSWORD)) {\r
- PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // When try to set a new password, user will be chanlleged with old password.\r
- // The Callback is responsible for validating old password input by user,\r
- // If Callback return EFI_SUCCESS, it indicates validation pass.\r
- //\r
- switch (PrivateData->PasswordState) {\r
- case BROWSER_STATE_VALIDATE_PASSWORD:\r
- Status = ValidatePassword (PrivateData, Value->string);\r
- if (Status == EFI_SUCCESS) {\r
- PrivateData->PasswordState = BROWSER_STATE_SET_PASSWORD;\r
- }\r
- break;\r
-\r
- case BROWSER_STATE_SET_PASSWORD:\r
- Status = SetPassword (PrivateData, Value->string);\r
- PrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- break;\r
-\r
default:\r
break;\r
}\r
mPrivateData->ConfigAccess.ExtractConfig = ExtractConfig;\r
mPrivateData->ConfigAccess.RouteConfig = RouteConfig;\r
mPrivateData->ConfigAccess.Callback = DriverCallback;\r
- mPrivateData->PasswordState = BROWSER_STATE_VALIDATE_PASSWORD;\r
\r
//\r
// Locate Hii Database protocol\r