+++ /dev/null
-/** @file\r
- Password Credential Provider driver implementation.\r
-\r
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
-(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "PwdCredentialProvider.h"\r
-\r
-CREDENTIAL_TABLE *mPwdTable = NULL;\r
-PWD_PROVIDER_CALLBACK_INFO *mCallbackInfo = NULL;\r
-PASSWORD_CREDENTIAL_INFO *mPwdInfoHandle = NULL;\r
-\r
-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {\r
- {\r
- {\r
- HARDWARE_DEVICE_PATH,\r
- HW_VENDOR_DP,\r
- {\r
- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
- }\r
- },\r
- PWD_CREDENTIAL_PROVIDER_GUID\r
- },\r
- {\r
- END_DEVICE_PATH_TYPE,\r
- END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- {\r
- (UINT8) (END_DEVICE_PATH_LENGTH),\r
- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
- }\r
- }\r
-};\r
-\r
-EFI_USER_CREDENTIAL2_PROTOCOL gPwdCredentialProviderDriver = {\r
- PWD_CREDENTIAL_PROVIDER_GUID,\r
- EFI_USER_CREDENTIAL_CLASS_PASSWORD,\r
- CredentialEnroll,\r
- CredentialForm,\r
- CredentialTile,\r
- CredentialTitle,\r
- CredentialUser,\r
- CredentialSelect,\r
- CredentialDeselect,\r
- CredentialDefault,\r
- CredentialGetInfo,\r
- CredentialGetNextInfo,\r
- EFI_CREDENTIAL_CAPABILITIES_ENROLL,\r
- CredentialDelete\r
-};\r
-\r
-\r
-/**\r
- Get string by string id from HII Interface.\r
-\r
-\r
- @param[in] Id String ID to get the string from.\r
-\r
- @retval CHAR16 * String from ID.\r
- @retval NULL If error occurs.\r
-\r
-**/\r
-CHAR16 *\r
-GetStringById (\r
- IN EFI_STRING_ID Id\r
- )\r
-{\r
- //\r
- // Get the current string for the current Language.\r
- //\r
- return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL);\r
-}\r
-\r
-\r
-/**\r
- Expand password table size.\r
-\r
-**/\r
-VOID\r
-ExpandTableSize (\r
- VOID\r
- )\r
-{\r
- CREDENTIAL_TABLE *NewTable;\r
- UINTN Count;\r
-\r
- Count = mPwdTable->MaxCount + PASSWORD_TABLE_INC;\r
- //\r
- // Create new credential table.\r
- //\r
- NewTable = (CREDENTIAL_TABLE *) AllocateZeroPool (\r
- sizeof (CREDENTIAL_TABLE) +\r
- (Count - 1) * sizeof (PASSWORD_INFO)\r
- );\r
- ASSERT (NewTable != NULL);\r
-\r
- NewTable->MaxCount = Count;\r
- NewTable->Count = mPwdTable->Count;\r
- NewTable->ValidIndex = mPwdTable->ValidIndex;\r
- //\r
- // Copy old entries\r
- //\r
- CopyMem (\r
- &NewTable->UserInfo,\r
- &mPwdTable->UserInfo,\r
- mPwdTable->Count * sizeof (PASSWORD_INFO)\r
- );\r
- FreePool (mPwdTable);\r
- mPwdTable = NewTable;\r
-}\r
-\r
-\r
-/**\r
- Add, update or delete info in table, and sync with NV variable.\r
-\r
- @param[in] Index The index of the password in table. If index is found in\r
- table, update the info, else add the into to table.\r
- @param[in] Info The new password info to add into table.If Info is NULL,\r
- delete the info by Index.\r
-\r
- @retval EFI_INVALID_PARAMETER Info is NULL when save the info.\r
- @retval EFI_SUCCESS Modify the table successfully.\r
- @retval Others Failed to modify the table.\r
-\r
-**/\r
-EFI_STATUS\r
-ModifyTable (\r
- IN UINTN Index,\r
- IN PASSWORD_INFO * Info OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- PASSWORD_INFO *NewPasswordInfo;\r
-\r
- NewPasswordInfo = NULL;\r
-\r
- if (Index < mPwdTable->Count) {\r
- if (Info == NULL) {\r
- //\r
- // Delete the specified entry.\r
- //\r
- mPwdTable->Count--;\r
- if (Index != mPwdTable->Count) {\r
- NewPasswordInfo = &mPwdTable->UserInfo[mPwdTable->Count];\r
- }\r
- } else {\r
- //\r
- // Update the specified entry.\r
- //\r
- NewPasswordInfo = Info;\r
- }\r
- } else {\r
- //\r
- // Add a new password info.\r
- //\r
- if (Info == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (mPwdTable->Count >= mPwdTable->MaxCount) {\r
- ExpandTableSize ();\r
- }\r
-\r
- NewPasswordInfo = Info;\r
- mPwdTable->Count++;\r
- }\r
-\r
- if (NewPasswordInfo != NULL) {\r
- CopyMem (&mPwdTable->UserInfo[Index], NewPasswordInfo, sizeof (PASSWORD_INFO));\r
- }\r
-\r
- //\r
- // Save the credential table.\r
- //\r
- Status = gRT->SetVariable (\r
- L"PwdCredential",\r
- &gPwdCredentialProviderGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- mPwdTable->Count * sizeof (PASSWORD_INFO),\r
- &mPwdTable->UserInfo\r
- );\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Create a password table.\r
-\r
- @retval EFI_SUCCESS Create a password table successfully.\r
- @retval Others Failed to create a password.\r
-\r
-**/\r
-EFI_STATUS\r
-InitCredentialTable (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *Var;\r
- UINTN VarSize;\r
-\r
- //\r
- // Get Password credential data from NV variable.\r
- //\r
- VarSize = 0;\r
- Var = NULL;\r
- Status = gRT->GetVariable (\r
- L"PwdCredential",\r
- &gPwdCredentialProviderGuid,\r
- NULL,\r
- &VarSize,\r
- Var\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- Var = AllocateZeroPool (VarSize);\r
- if (Var == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = gRT->GetVariable (\r
- L"PwdCredential",\r
- &gPwdCredentialProviderGuid,\r
- NULL,\r
- &VarSize,\r
- Var\r
- );\r
- }\r
- if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Create the password credential table.\r
- //\r
- mPwdTable = AllocateZeroPool (\r
- sizeof (CREDENTIAL_TABLE) - sizeof (PASSWORD_INFO) +\r
- PASSWORD_TABLE_INC * sizeof (PASSWORD_INFO) +\r
- VarSize\r
- );\r
- if (mPwdTable == NULL) {\r
- FreePool (Var);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- mPwdTable->Count = VarSize / sizeof (PASSWORD_INFO);\r
- mPwdTable->MaxCount = mPwdTable->Count + PASSWORD_TABLE_INC;\r
- mPwdTable->ValidIndex = 0;\r
- if (Var != NULL) {\r
- CopyMem (mPwdTable->UserInfo, Var, VarSize);\r
- FreePool (Var);\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Hash the password to get credential.\r
-\r
- @param[in] Password Points to the input password.\r
- @param[in] PasswordSize The size of password, in bytes.\r
- @param[out] Credential Points to the hashed result.\r
-\r
- @retval TRUE Hash the password successfully.\r
- @retval FALSE Failed to hash the password.\r
-\r
-**/\r
-BOOLEAN\r
-GenerateCredential (\r
- IN CHAR16 *Password,\r
- IN UINTN PasswordSize,\r
- OUT UINT8 *Credential\r
- )\r
-{\r
- BOOLEAN Status;\r
- UINTN HashSize;\r
- VOID *Hash;\r
-\r
- HashSize = Sha1GetContextSize ();\r
- Hash = AllocatePool (HashSize);\r
- ASSERT (Hash != NULL);\r
-\r
- Status = Sha1Init (Hash);\r
- if (!Status) {\r
- goto Done;\r
- }\r
-\r
- Status = Sha1Update (Hash, Password, PasswordSize);\r
- if (!Status) {\r
- goto Done;\r
- }\r
-\r
- Status = Sha1Final (Hash, Credential);\r
-\r
-Done:\r
- FreePool (Hash);\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Get password from user input.\r
-\r
- @param[in] FirstPwd If True, prompt to input the first password.\r
- If False, prompt to input password again.\r
- @param[out] Credential Points to the input password.\r
-\r
-**/\r
-VOID\r
-GetPassword (\r
- IN BOOLEAN FirstPwd,\r
- OUT CHAR8 *Credential\r
- )\r
-{\r
- EFI_INPUT_KEY Key;\r
- CHAR16 PasswordMask[CREDENTIAL_LEN + 1];\r
- CHAR16 Password[CREDENTIAL_LEN];\r
- UINTN PasswordLen;\r
- CHAR16 *QuestionStr;\r
- CHAR16 *LineStr;\r
-\r
- PasswordLen = 0;\r
- while (TRUE) {\r
- PasswordMask[PasswordLen] = L'_';\r
- PasswordMask[PasswordLen + 1] = L'\0';\r
- LineStr = GetStringById (STRING_TOKEN (STR_DRAW_A_LINE));\r
- if (FirstPwd) {\r
- QuestionStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD));\r
- } else {\r
- QuestionStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD_AGAIN));\r
- }\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- QuestionStr,\r
- LineStr,\r
- PasswordMask,\r
- NULL\r
- );\r
- FreePool (QuestionStr);\r
- FreePool (LineStr);\r
-\r
- //\r
- // Check key stroke\r
- //\r
- if (Key.ScanCode == SCAN_NULL) {\r
- if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
- break;\r
- } else if (Key.UnicodeChar == CHAR_BACKSPACE) {\r
- if (PasswordLen > 0) {\r
- PasswordLen--;\r
- }\r
- } else if ((Key.UnicodeChar == CHAR_NULL) ||\r
- (Key.UnicodeChar == CHAR_TAB) ||\r
- (Key.UnicodeChar == CHAR_LINEFEED)) {\r
- continue;\r
- } else {\r
- Password[PasswordLen] = Key.UnicodeChar;\r
- PasswordMask[PasswordLen] = L'*';\r
- PasswordLen++;\r
- if (PasswordLen == CREDENTIAL_LEN) {\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-\r
- PasswordLen = PasswordLen * sizeof (CHAR16);\r
- GenerateCredential (Password, PasswordLen, (UINT8 *)Credential);\r
-}\r
-\r
-/**\r
- Check whether the password can be found on this provider.\r
-\r
- @param[in] Password The password to be found.\r
-\r
- @retval EFI_SUCCESS Found password sucessfully.\r
- @retval EFI_NOT_FOUND Fail to find the password.\r
-\r
-**/\r
-EFI_STATUS\r
-CheckPassword (\r
- IN CHAR8 *Password\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *Pwd;\r
-\r
- //\r
- // Check password credential.\r
- //\r
- mPwdTable->ValidIndex = 0;\r
- for (Index = 0; Index < mPwdTable->Count; Index++) {\r
- Pwd = mPwdTable->UserInfo[Index].Password;\r
- if (CompareMem (Pwd, Password, CREDENTIAL_LEN) == 0) {\r
- mPwdTable->ValidIndex = Index + 1;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Find a user infomation record by the information record type.\r
-\r
- This function searches all user information records of User from beginning\r
- until either the information is found, or there are no more user infomation\r
- records. A match occurs when a Info.InfoType field matches the user information\r
- record type.\r
-\r
- @param[in] User Points to the user profile record to search.\r
- @param[in] InfoType The infomation type to be searched.\r
- @param[out] Info Points to the user info found, the caller is responsible\r
- to free.\r
-\r
- @retval EFI_SUCCESS Find the user information successfully.\r
- @retval Others Fail to find the user information.\r
-\r
-**/\r
-EFI_STATUS\r
-FindUserInfoByType (\r
- IN EFI_USER_PROFILE_HANDLE User,\r
- IN UINT8 InfoType,\r
- OUT EFI_USER_INFO **Info\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_INFO *UserInfo;\r
- UINTN UserInfoSize;\r
- EFI_USER_INFO_HANDLE UserInfoHandle;\r
- EFI_USER_MANAGER_PROTOCOL *UserManager;\r
-\r
- //\r
- // Find user information by information type.\r
- //\r
- if (Info == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiUserManagerProtocolGuid,\r
- NULL,\r
- (VOID **) &UserManager\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Get each user information.\r
- //\r
-\r
- UserInfoHandle = NULL;\r
- UserInfo = NULL;\r
- UserInfoSize = 0;\r
- while (TRUE) {\r
- Status = UserManager->GetNextInfo (UserManager, User, &UserInfoHandle);\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- //\r
- // Get information.\r
- //\r
- Status = UserManager->GetInfo (\r
- UserManager,\r
- User,\r
- UserInfoHandle,\r
- UserInfo,\r
- &UserInfoSize\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- if (UserInfo != NULL) {\r
- FreePool (UserInfo);\r
- }\r
- UserInfo = AllocateZeroPool (UserInfoSize);\r
- if (UserInfo == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = UserManager->GetInfo (\r
- UserManager,\r
- User,\r
- UserInfoHandle,\r
- UserInfo,\r
- &UserInfoSize\r
- );\r
- }\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
-\r
- ASSERT (UserInfo != NULL);\r
- if (UserInfo->InfoType == InfoType) {\r
- *Info = UserInfo;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- if (UserInfo != NULL) {\r
- FreePool (UserInfo);\r
- }\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This function processes the results of changes in configuration.\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Action Specifies the type of action taken by the browser.\r
- @param QuestionId A unique value which is sent to the original\r
- exporting driver so that it can identify the type\r
- of data to expect.\r
- @param Type The type of value for the question.\r
- @param Value A pointer to the data being sent to the original\r
- exporting driver.\r
- @param ActionRequest On return, points to the action requested by the\r
- callback function.\r
-\r
- @retval EFI_SUCCESS The callback successfully handled the action.\r
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
- variable and its data.\r
- @retval EFI_DEVICE_ERROR The variable could not be saved.\r
- @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
- callback.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDriverCallback (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN EFI_BROWSER_ACTION Action,\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN UINT8 Type,\r
- IN EFI_IFR_TYPE_VALUE *Value,\r
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_INPUT_KEY Key;\r
- CHAR8 Password[CREDENTIAL_LEN];\r
- CHAR16 *PromptStr;\r
-\r
- if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
- if (QuestionId == KEY_GET_PASSWORD) {\r
- //\r
- // Get and check password.\r
- //\r
- GetPassword (TRUE, Password);\r
- Status = CheckPassword (Password);\r
- if (EFI_ERROR (Status)) {\r
- PromptStr = GetStringById (STRING_TOKEN (STR_PASSWORD_INCORRECT));\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- L"",\r
- PromptStr,\r
- L"",\r
- NULL\r
- );\r
- FreePool (PromptStr);\r
- return Status;\r
- }\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
- }\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // All other action return unsupported.\r
- //\r
- return EFI_UNSUPPORTED;\r
-}\r
-\r
-\r
-/**\r
- This function allows a caller to extract the current configuration for one\r
- or more named elements from the target driver.\r
-\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
- @param Progress On return, points to a character in the Request string.\r
- Points to the string's null terminator if request was successful.\r
- Points to the most recent '&' before the first failing name/value\r
- pair (or the beginning of the string if the failure is in the\r
- first name/value pair) if the request was not successful.\r
- @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
- has all values filled in for the names in the Request string.\r
- String to be allocated by the called function.\r
-\r
- @retval EFI_SUCCESS The Results is filled with the requested values.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
- @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
- @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FakeExtractConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Request,\r
- OUT EFI_STRING *Progress,\r
- OUT EFI_STRING *Results\r
- )\r
-{\r
- if (Progress == NULL || Results == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- *Progress = Request;\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
- This function processes the results of changes in configuration.\r
-\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
- @param Progress A pointer to a string filled in with the offset of the most\r
- recent '&' before the first failing name/value pair (or the\r
- beginning of the string if the failure is in the first\r
- name/value pair) or the terminating NULL if all was successful.\r
-\r
- @retval EFI_SUCCESS The Results is processed successfully.\r
- @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
- @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FakeRouteConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Configuration,\r
- OUT EFI_STRING *Progress\r
- )\r
-{\r
- if (Configuration == NULL || Progress == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *Progress = Configuration;\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
- This function initialize the data mainly used in form browser.\r
-\r
- @retval EFI_SUCCESS Initialize form data successfully.\r
- @retval Others Fail to Initialize form data.\r
-\r
-**/\r
-EFI_STATUS\r
-InitFormBrowser (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- PWD_PROVIDER_CALLBACK_INFO *CallbackInfo;\r
-\r
- //\r
- // Initialize driver private data.\r
- //\r
- CallbackInfo = AllocateZeroPool (sizeof (PWD_PROVIDER_CALLBACK_INFO));\r
- if (CallbackInfo == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- CallbackInfo->Signature = PWD_PROVIDER_SIGNATURE;\r
- CallbackInfo->ConfigAccess.ExtractConfig = FakeExtractConfig;\r
- CallbackInfo->ConfigAccess.RouteConfig = FakeRouteConfig;\r
- CallbackInfo->ConfigAccess.Callback = CredentialDriverCallback;\r
- CallbackInfo->DriverHandle = NULL;\r
-\r
- //\r
- // Install Device Path Protocol and Config Access protocol to driver handle.\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &CallbackInfo->DriverHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- &mHiiVendorDevicePath,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- &CallbackInfo->ConfigAccess,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Publish HII data.\r
- //\r
- CallbackInfo->HiiHandle = HiiAddPackages (\r
- &gPwdCredentialProviderGuid,\r
- CallbackInfo->DriverHandle,\r
- PwdCredentialProviderStrings,\r
- PwdCredentialProviderVfrBin,\r
- NULL\r
- );\r
- if (CallbackInfo->HiiHandle == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- mCallbackInfo = CallbackInfo;\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Enroll a user on a credential provider.\r
-\r
- This function enrolls a user on this credential provider. If the user exists on\r
- this credential provider, update the user information on this credential provider;\r
- otherwise add the user information on credential provider.\r
-\r
- @param[in] This Points to this instance of EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in] User The user profile to enroll.\r
-\r
- @retval EFI_SUCCESS User profile was successfully enrolled.\r
- @retval EFI_ACCESS_DENIED Current user profile does not permit enrollment on the\r
- user profile handle. Either the user profile cannot enroll\r
- on any user profile or cannot enroll on a user profile\r
- other than the current user profile.\r
- @retval EFI_UNSUPPORTED This credential provider does not support enrollment in\r
- the pre-OS.\r
- @retval EFI_DEVICE_ERROR The new credential could not be created because of a device\r
- error.\r
- @retval EFI_INVALID_PARAMETER User does not refer to a valid user profile handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialEnroll (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN EFI_USER_PROFILE_HANDLE User\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- PASSWORD_INFO PwdInfo;\r
- EFI_USER_INFO *UserInfo;\r
- CHAR8 Password[CREDENTIAL_LEN];\r
- EFI_INPUT_KEY Key;\r
- UINT8 *UserId;\r
- CHAR16 *QuestionStr;\r
- CHAR16 *PromptStr;\r
-\r
- if ((This == NULL) || (User == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Get User Identifier.\r
- //\r
- UserInfo = NULL;\r
- Status = FindUserInfoByType (\r
- User,\r
- EFI_USER_INFO_IDENTIFIER_RECORD,\r
- &UserInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- CopyMem (PwdInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof (EFI_USER_INFO_IDENTIFIER));\r
- FreePool (UserInfo);\r
-\r
- //\r
- // Get password from user.\r
- //\r
- while (TRUE) {\r
- //\r
- // Input password.\r
- //\r
- GetPassword (TRUE, PwdInfo.Password);\r
-\r
- //\r
- // Input password again.\r
- //\r
- GetPassword (FALSE, Password);\r
-\r
- //\r
- // Compare the two password consistency.\r
- //\r
- if (CompareMem (PwdInfo.Password, Password, CREDENTIAL_LEN) == 0) {\r
- break;\r
- }\r
-\r
- QuestionStr = GetStringById (STRING_TOKEN (STR_PASSWORD_MISMATCH));\r
- PromptStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD_AGAIN));\r
- CreatePopUp (\r
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
- &Key,\r
- QuestionStr,\r
- L"",\r
- PromptStr,\r
- NULL\r
- );\r
- FreePool (QuestionStr);\r
- FreePool (PromptStr);\r
- }\r
-\r
- //\r
- // Check whether User is ever enrolled in the provider.\r
- //\r
- for (Index = 0; Index < mPwdTable->Count; Index++) {\r
- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
- if (CompareMem (UserId, (UINT8 *) &PwdInfo.UserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
- //\r
- // User already exists, update the password.\r
- //\r
- break;\r
- }\r
- }\r
-\r
- //\r
- // Enroll the User to the provider.\r
- //\r
- Status = ModifyTable (Index, &PwdInfo);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Returns the user interface information used during user identification.\r
-\r
- This function returns information about the form used when interacting with the\r
- user during user identification. The form is the first enabled form in the form-set\r
- class EFI_HII_USER_CREDENTIAL_FORMSET_GUID installed on the HII handle HiiHandle. If\r
- the user credential provider does not require a form to identify the user, then this\r
- function should return EFI_NOT_FOUND.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[out] Hii On return, holds the HII database handle.\r
- @param[out] FormSetId On return, holds the identifier of the form set which contains\r
- the form used during user identification.\r
- @param[out] FormId On return, holds the identifier of the form used during user\r
- identification.\r
-\r
- @retval EFI_SUCCESS Form returned successfully.\r
- @retval EFI_NOT_FOUND Form not returned.\r
- @retval EFI_INVALID_PARAMETER Hii is NULL or FormSetId is NULL or FormId is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialForm (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- OUT EFI_HII_HANDLE *Hii,\r
- OUT EFI_GUID *FormSetId,\r
- OUT EFI_FORM_ID *FormId\r
- )\r
-{\r
- if ((This == NULL) || (Hii == NULL) ||\r
- (FormSetId == NULL) || (FormId == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *Hii = mCallbackInfo->HiiHandle;\r
- *FormId = FORMID_GET_PASSWORD_FORM;\r
- CopyGuid (FormSetId, &gPwdCredentialProviderGuid);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Returns bitmap used to describe the credential provider type.\r
-\r
- This optional function returns a bitmap that is less than or equal to the number\r
- of pixels specified by Width and Height. If no such bitmap exists, then EFI_NOT_FOUND\r
- is returned.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in, out] Width On entry, points to the desired bitmap width. If NULL then no\r
- bitmap information will be returned. On exit, points to the\r
- width of the bitmap returned.\r
- @param[in, out] Height On entry, points to the desired bitmap height. If NULL then no\r
- bitmap information will be returned. On exit, points to the\r
- height of the bitmap returned\r
- @param[out] Hii On return, holds the HII database handle.\r
- @param[out] Image On return, holds the HII image identifier.\r
-\r
- @retval EFI_SUCCESS Image identifier returned successfully.\r
- @retval EFI_NOT_FOUND Image identifier not returned.\r
- @retval EFI_INVALID_PARAMETER Hii is NULL or Image is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialTile (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN OUT UINTN *Width,\r
- IN OUT UINTN *Height,\r
- OUT EFI_HII_HANDLE *Hii,\r
- OUT EFI_IMAGE_ID *Image\r
- )\r
-{\r
- if ((This == NULL) || (Hii == NULL) || (Image == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Returns string used to describe the credential provider type.\r
-\r
- This function returns a string which describes the credential provider. If no\r
- such string exists, then EFI_NOT_FOUND is returned.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[out] Hii On return, holds the HII database handle.\r
- @param[out] String On return, holds the HII string identifier.\r
-\r
- @retval EFI_SUCCESS String identifier returned successfully.\r
- @retval EFI_NOT_FOUND String identifier not returned.\r
- @retval EFI_INVALID_PARAMETER Hii is NULL or String is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialTitle (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- OUT EFI_HII_HANDLE *Hii,\r
- OUT EFI_STRING_ID *String\r
- )\r
-{\r
- if ((This == NULL) || (Hii == NULL) || (String == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Set Hii handle and String ID.\r
- //\r
- *Hii = mCallbackInfo->HiiHandle;\r
- *String = STRING_TOKEN (STR_CREDENTIAL_TITLE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Return the user identifier associated with the currently authenticated user.\r
-\r
- This function returns the user identifier of the user authenticated by this credential\r
- provider. This function is called after the credential-related information has been\r
- submitted on a form, OR after a call to Default() has returned that this credential is\r
- ready to log on.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in] User The user profile handle of the user profile currently being\r
- considered by the user identity manager. If NULL, then no user\r
- profile is currently under consideration.\r
- @param[out] Identifier On return, points to the user identifier.\r
-\r
- @retval EFI_SUCCESS User identifier returned successfully.\r
- @retval EFI_NOT_READY No user identifier can be returned.\r
- @retval EFI_ACCESS_DENIED The user has been locked out of this user credential.\r
- @retval EFI_INVALID_PARAMETER This is NULL, or Identifier is NULL.\r
- @retval EFI_NOT_FOUND User is not NULL, and the specified user handle can't be\r
- found in user profile database\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialUser (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN EFI_USER_PROFILE_HANDLE User,\r
- OUT EFI_USER_INFO_IDENTIFIER *Identifier\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- EFI_USER_INFO *UserInfo;\r
- UINT8 *UserId;\r
- UINT8 *NewUserId;\r
- CHAR8 *Pwd;\r
- CHAR8 *NewPwd;\r
-\r
- if ((This == NULL) || (Identifier == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (mPwdTable->ValidIndex == 0) {\r
- //\r
- // No password input, or the input password doesn't match\r
- // anyone in PwdTable.\r
- //\r
- return EFI_NOT_READY;\r
- }\r
-\r
- if (User == NULL) {\r
- //\r
- // Return the user ID whose password matches the input password.\r
- //\r
- CopyMem (\r
- Identifier,\r
- &mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].UserId,\r
- sizeof (EFI_USER_INFO_IDENTIFIER)\r
- );\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Get the User's ID.\r
- //\r
- Status = FindUserInfoByType (\r
- User,\r
- EFI_USER_INFO_IDENTIFIER_RECORD,\r
- &UserInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Check whether the input password matches one in PwdTable.\r
- //\r
- for (Index = 0; Index < mPwdTable->Count; Index++) {\r
- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
- NewUserId = (UINT8 *) (UserInfo + 1);\r
- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
- Pwd = mPwdTable->UserInfo[Index].Password;\r
- NewPwd = mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].Password;\r
- if (CompareMem (Pwd, NewPwd, CREDENTIAL_LEN) == 0) {\r
- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
- FreePool (UserInfo);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
-\r
- FreePool (UserInfo);\r
- return EFI_NOT_READY;\r
-}\r
-\r
-\r
-/**\r
- Indicate that user interface interaction has begun for the specified credential.\r
-\r
- This function is called when a credential provider is selected by the user. If\r
- AutoLogon returns FALSE, then the user interface will be constructed by the User\r
- Identity Manager.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[out] AutoLogon On return, points to the credential provider's capabilities\r
- after the credential provider has been selected by the user.\r
-\r
- @retval EFI_SUCCESS Credential provider successfully selected.\r
- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialSelect (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon\r
- )\r
-{\r
- if ((This == NULL) || (AutoLogon == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- *AutoLogon = 0;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Indicate that user interface interaction has ended for the specified credential.\r
-\r
- This function is called when a credential provider is deselected by the user.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-\r
- @retval EFI_SUCCESS Credential provider successfully deselected.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDeselect (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This\r
- )\r
-{\r
- if (This == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Return the default logon behavior for this user credential.\r
-\r
- This function reports the default login behavior regarding this credential provider.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[out] AutoLogon On return, holds whether the credential provider should be used\r
- by default to automatically log on the user.\r
-\r
- @retval EFI_SUCCESS Default information successfully returned.\r
- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDefault (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon\r
- )\r
-{\r
- if ((This == NULL) || (AutoLogon == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- *AutoLogon = 0;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Return information attached to the credential provider.\r
-\r
- This function returns user information.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in] UserInfo Handle of the user information data record.\r
- @param[out] Info On entry, points to a buffer of at least *InfoSize bytes. On\r
- exit, holds the user information. If the buffer is too small\r
- to hold the information, then EFI_BUFFER_TOO_SMALL is returned\r
- and InfoSize is updated to contain the number of bytes actually\r
- required.\r
- @param[in, out] InfoSize On entry, points to the size of Info. On return, points to the\r
- size of the user information.\r
-\r
- @retval EFI_SUCCESS Information returned successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The size specified by InfoSize is too small to hold all of the\r
- user information. The size required is returned in *InfoSize.\r
- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.\r
- @retval EFI_NOT_FOUND The specified UserInfo does not refer to a valid user info handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialGetInfo (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN EFI_USER_INFO_HANDLE UserInfo,\r
- OUT EFI_USER_INFO *Info,\r
- IN OUT UINTN *InfoSize\r
- )\r
-{\r
- EFI_USER_INFO *CredentialInfo;\r
- UINTN Index;\r
-\r
- if ((This == NULL) || (InfoSize == NULL) || (Info == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if ((UserInfo == NULL) || (mPwdInfoHandle == NULL)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Find information handle in credential info table.\r
- //\r
- for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {\r
- CredentialInfo = mPwdInfoHandle->Info[Index];\r
- if (UserInfo == (EFI_USER_INFO_HANDLE)CredentialInfo) {\r
- //\r
- // The handle is found, copy the user info.\r
- //\r
- if (CredentialInfo->InfoSize > *InfoSize) {\r
- *InfoSize = CredentialInfo->InfoSize;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
- CopyMem (Info, CredentialInfo, CredentialInfo->InfoSize);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Enumerate all of the user informations on the credential provider.\r
-\r
- This function returns the next user information record. To retrieve the first user\r
- information record handle, point UserInfo at a NULL. Each subsequent call will retrieve\r
- another user information record handle until there are no more, at which point UserInfo\r
- will point to NULL.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in, out] UserInfo On entry, points to the previous user information handle or NULL\r
- to start enumeration. On exit, points to the next user information\r
- handle or NULL if there is no more user information.\r
-\r
- @retval EFI_SUCCESS User information returned.\r
- @retval EFI_NOT_FOUND No more user information found.\r
- @retval EFI_INVALID_PARAMETER UserInfo is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialGetNextInfo (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN OUT EFI_USER_INFO_HANDLE *UserInfo\r
- )\r
-{\r
- EFI_USER_INFO *Info;\r
- CHAR16 *ProvNameStr;\r
- UINTN InfoLen;\r
- UINTN Index;\r
- UINTN ProvStrLen;\r
-\r
- if ((This == NULL) || (UserInfo == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (mPwdInfoHandle == NULL) {\r
- //\r
- // Initilized user info table. There are 4 user info records in the table.\r
- //\r
- InfoLen = sizeof (PASSWORD_CREDENTIAL_INFO) + (4 - 1) * sizeof (EFI_USER_INFO *);\r
- mPwdInfoHandle = AllocateZeroPool (InfoLen);\r
- if (mPwdInfoHandle == NULL) {\r
- *UserInfo = NULL;\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // The first information, Credential Provider info.\r
- //\r
- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);\r
- Info = AllocateZeroPool (InfoLen);\r
- ASSERT (Info != NULL);\r
-\r
- Info->InfoType = EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD;\r
- Info->InfoSize = (UINT32) InfoLen;\r
- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
- CopyGuid ((EFI_GUID *)(Info + 1), &gPwdCredentialProviderGuid);\r
-\r
- mPwdInfoHandle->Info[0] = Info;\r
- mPwdInfoHandle->Count++;\r
-\r
- //\r
- // The second information, Credential Provider name info.\r
- //\r
- ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_NAME));\r
- ProvStrLen = StrSize (ProvNameStr);\r
- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;\r
- Info = AllocateZeroPool (InfoLen);\r
- ASSERT (Info != NULL);\r
-\r
- Info->InfoType = EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;\r
- Info->InfoSize = (UINT32) InfoLen;\r
- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
- FreePool (ProvNameStr);\r
-\r
- mPwdInfoHandle->Info[1] = Info;\r
- mPwdInfoHandle->Count++;\r
-\r
- //\r
- // The third information, Credential Provider type info.\r
- //\r
- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);\r
- Info = AllocateZeroPool (InfoLen);\r
- ASSERT (Info != NULL);\r
-\r
- Info->InfoType = EFI_USER_INFO_CREDENTIAL_TYPE_RECORD;\r
- Info->InfoSize = (UINT32) InfoLen;\r
- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
- CopyGuid ((EFI_GUID *)(Info + 1), &gEfiUserCredentialClassPasswordGuid);\r
-\r
- mPwdInfoHandle->Info[2] = Info;\r
- mPwdInfoHandle->Count++;\r
-\r
- //\r
- // The fourth information, Credential Provider type name info.\r
- //\r
- ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_TYPE_NAME));\r
- ProvStrLen = StrSize (ProvNameStr);\r
- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;\r
- Info = AllocateZeroPool (InfoLen);\r
- ASSERT (Info != NULL);\r
-\r
- Info->InfoType = EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;\r
- Info->InfoSize = (UINT32) InfoLen;\r
- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
- FreePool (ProvNameStr);\r
-\r
- mPwdInfoHandle->Info[3] = Info;\r
- mPwdInfoHandle->Count++;\r
- }\r
-\r
- if (*UserInfo == NULL) {\r
- //\r
- // Return the first info handle.\r
- //\r
- *UserInfo = (EFI_USER_INFO_HANDLE) mPwdInfoHandle->Info[0];\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Find information handle in credential info table.\r
- //\r
- for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {\r
- Info = mPwdInfoHandle->Info[Index];\r
- if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {\r
- //\r
- // The handle is found, get the next one.\r
- //\r
- if (Index == mPwdInfoHandle->Count - 1) {\r
- //\r
- // Already last one.\r
- //\r
- *UserInfo = NULL;\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Index++;\r
- *UserInfo = (EFI_USER_INFO_HANDLE)mPwdInfoHandle->Info[Index];\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- *UserInfo = NULL;\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
- Delete a user on this credential provider.\r
-\r
- This function deletes a user on this credential provider.\r
-\r
- @param[in] This Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
- @param[in] User The user profile handle to delete.\r
-\r
- @retval EFI_SUCCESS User profile was successfully deleted.\r
- @retval EFI_ACCESS_DENIED Current user profile does not permit deletion on the user profile handle.\r
- Either the user profile cannot delete on any user profile or cannot delete\r
- on a user profile other than the current user profile.\r
- @retval EFI_UNSUPPORTED This credential provider does not support deletion in the pre-OS.\r
- @retval EFI_DEVICE_ERROR The new credential could not be deleted because of a device error.\r
- @retval EFI_INVALID_PARAMETER User does not refer to a valid user profile handle.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDelete (\r
- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,\r
- IN EFI_USER_PROFILE_HANDLE User\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_USER_INFO *UserInfo;\r
- UINT8 *UserId;\r
- UINT8 *NewUserId;\r
- UINTN Index;\r
-\r
- if ((This == NULL) || (User == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Get User Identifier.\r
- //\r
- UserInfo = NULL;\r
- Status = FindUserInfoByType (\r
- User,\r
- EFI_USER_INFO_IDENTIFIER_RECORD,\r
- &UserInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Find the user by user identifier in mPwdTable.\r
- //\r
- for (Index = 0; Index < mPwdTable->Count; Index++) {\r
- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
- NewUserId = (UINT8 *) (UserInfo + 1);\r
- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
- //\r
- // Found the user, delete it.\r
- //\r
- ModifyTable (Index, NULL);\r
- break;\r
- }\r
- }\r
-\r
- FreePool (UserInfo);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Main entry for this driver.\r
-\r
- @param ImageHandle Image handle this driver.\r
- @param SystemTable Pointer to SystemTable.\r
-\r
- @retval EFI_SUCESS This function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PasswordProviderInit (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- //\r
- // It is NOT robust enough to be included in production.\r
- //\r
- #error "This implementation is just a sample, please comment this line if you really want to use this driver."\r
-\r
- //\r
- // Init credential table.\r
- //\r
- Status = InitCredentialTable ();\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Init Form Browser.\r
- //\r
- Status = InitFormBrowser ();\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Install protocol interfaces for the password credential provider.\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &mCallbackInfo->DriverHandle,\r
- &gEfiUserCredential2ProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gPwdCredentialProviderDriver\r
- );\r
- return Status;\r
-}\r