+++ /dev/null
-/** @file\r
- Usb Credential Provider driver implemenetation.\r
-\r
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<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 "UsbCredentialProvider.h"\r
-\r
-CREDENTIAL_TABLE *mUsbTable = NULL;\r
-USB_PROVIDER_CALLBACK_INFO *mCallbackInfo = NULL;\r
-USB_CREDENTIAL_INFO *mUsbInfoHandle = NULL;\r
-\r
-EFI_USER_CREDENTIAL2_PROTOCOL gUsbCredentialProviderDriver = {\r
- USB_CREDENTIAL_PROVIDER_GUID,\r
- EFI_USER_CREDENTIAL_CLASS_SECURE_CARD,\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 = mUsbTable->MaxCount + USB_TABLE_INC;\r
- //\r
- // Create new credential table.\r
- //\r
- NewTable = AllocateZeroPool (\r
- sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +\r
- Count * sizeof (USB_INFO)\r
- );\r
- ASSERT (NewTable != NULL);\r
-\r
- NewTable->MaxCount = Count;\r
- NewTable->Count = mUsbTable->Count;\r
-\r
- //\r
- // Copy old entries.\r
- //\r
- CopyMem (\r
- &NewTable->UserInfo,\r
- &mUsbTable->UserInfo,\r
- mUsbTable->Count * sizeof (USB_INFO)\r
- );\r
- FreePool (mUsbTable);\r
- mUsbTable = 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 credential 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 USB_INFO * Info OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- USB_INFO *NewUsbInfo;\r
-\r
- NewUsbInfo = NULL;\r
- if (Index < mUsbTable->Count) {\r
- if (Info == NULL) {\r
- //\r
- // Delete the specified entry.\r
- //\r
- mUsbTable->Count--;\r
- if (Index != mUsbTable->Count) {\r
- NewUsbInfo = &mUsbTable->UserInfo[mUsbTable->Count];\r
- }\r
- } else {\r
- //\r
- // Update the specified entry.\r
- //\r
- NewUsbInfo = Info;\r
- }\r
- } else {\r
- //\r
- // Add a new entry\r
- //\r
- if (Info == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (mUsbTable->Count >= mUsbTable->MaxCount) {\r
- ExpandTableSize ();\r
- }\r
-\r
- NewUsbInfo = Info;\r
- mUsbTable->Count++;\r
- }\r
-\r
- if (NewUsbInfo != NULL) {\r
- CopyMem (&mUsbTable->UserInfo[Index], NewUsbInfo, sizeof (USB_INFO));\r
- }\r
-\r
- //\r
- // Save the credential table.\r
- //\r
- Status = gRT->SetVariable (\r
- L"UsbCredential",\r
- &gUsbCredentialProviderGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- mUsbTable->Count * sizeof (USB_INFO),\r
- &mUsbTable->UserInfo\r
- );\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Create a credential table\r
-\r
- @retval EFI_SUCCESS Create a credential 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 Usb credential data from NV variable.\r
- //\r
- VarSize = 0;\r
- Var = NULL;\r
- Status = gRT->GetVariable (\r
- L"UsbCredential",\r
- &gUsbCredentialProviderGuid,\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"UsbCredential",\r
- &gUsbCredentialProviderGuid,\r
- NULL,\r
- &VarSize,\r
- Var\r
- );\r
- }\r
- if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Init Usb credential table.\r
- //\r
- mUsbTable = AllocateZeroPool (\r
- sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +\r
- USB_TABLE_INC * sizeof (USB_INFO) +\r
- VarSize\r
- );\r
- if (mUsbTable == NULL) {\r
- FreePool (Var);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- mUsbTable->Count = VarSize / sizeof (USB_INFO);\r
- mUsbTable->MaxCount = mUsbTable->Count + USB_TABLE_INC;\r
- if (Var != NULL) {\r
- CopyMem (mUsbTable->UserInfo, Var, VarSize);\r
- FreePool (Var);\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Read the specified file by FileName in the Usb key and return the file size in BufferSize\r
- and file content in Buffer.\r
- Note: the caller is responsible to free the buffer memory.\r
-\r
- @param FileName File to read.\r
- @param Buffer Returned with data read from the file.\r
- @param BufferSize Size of the data buffer.\r
-\r
- @retval EFI_SUCCESS The command completed successfully.\r
- @retval EFI_OUT_OF_RESOURCES Resource allocation failed.\r
- @retval EFI_NOT_FOUND File not found.\r
- @retval EFI_DEVICE_ERROR Device I/O error.\r
-\r
-**/\r
-EFI_STATUS\r
-GetFileData (\r
- IN CHAR16 *FileName,\r
- OUT VOID **Buffer,\r
- OUT UINTN *BufferSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN HandleCount;\r
- UINTN ScratchBufferSize;\r
- EFI_HANDLE *HandleBuffer;\r
- EFI_FILE *RootFs;\r
- EFI_FILE *FileHandle;\r
- EFI_FILE_INFO *FileInfo;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
- EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
-\r
- FileInfo = NULL;\r
- FileHandle = NULL;\r
-\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Can not Locate SimpleFileSystemProtocol\n"));\r
- goto Done;\r
- }\r
-\r
- //\r
- // Find and open the file in removable media disk.\r
- //\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[Index],\r
- &gEfiBlockIoProtocolGuid,\r
- (VOID **) &BlkIo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- if (BlkIo->Media->RemovableMedia) {\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[Index],\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID **) &SimpleFileSystem\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- Status = SimpleFileSystem->OpenVolume (\r
- SimpleFileSystem,\r
- &RootFs\r
- );\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- Status = RootFs->Open (\r
- RootFs,\r
- &FileHandle,\r
- FileName,\r
- EFI_FILE_MODE_READ,\r
- 0\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- FreePool (HandleBuffer);\r
-\r
- if (Index >= HandleCount) {\r
- DEBUG ((DEBUG_ERROR, "Can not found the token file!\n"));\r
- Status = EFI_NOT_FOUND;\r
- goto Done;\r
- }\r
-\r
- //\r
- // Figure out how big the file is.\r
- //\r
- ScratchBufferSize = 0;\r
- Status = FileHandle->GetInfo (\r
- FileHandle,\r
- &gEfiFileInfoGuid,\r
- &ScratchBufferSize,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- DEBUG ((DEBUG_ERROR, "Can not obtain file size info!\n"));\r
- Status = EFI_DEVICE_ERROR;\r
- goto Done;\r
- }\r
-\r
- FileInfo = AllocateZeroPool (ScratchBufferSize);\r
- if (FileInfo == NULL) {\r
- DEBUG ((DEBUG_ERROR, "Can not allocate enough memory for the token file!\n"));\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
-\r
- Status = FileHandle->GetInfo (\r
- FileHandle,\r
- &gEfiFileInfoGuid,\r
- &ScratchBufferSize,\r
- FileInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Can not obtain file info from the token file!\n"));\r
- Status = EFI_DEVICE_ERROR;\r
- goto Done;\r
- }\r
-\r
- //\r
- // Allocate a buffer for the file.\r
- //\r
- *BufferSize = (UINT32) FileInfo->FileSize;\r
- *Buffer = AllocateZeroPool (*BufferSize);\r
- if (*Buffer == NULL) {\r
- DEBUG ((DEBUG_ERROR, "Can not allocate a buffer for the file!\n"));\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
-\r
- //\r
- // Load file into the allocated memory.\r
- //\r
- Status = FileHandle->Read (FileHandle, BufferSize, *Buffer);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (*Buffer);\r
- DEBUG ((DEBUG_ERROR, "Can not read the token file!\n"));\r
- Status = EFI_DEVICE_ERROR;\r
- goto Done;\r
- }\r
-\r
- //\r
- // Close file.\r
- //\r
- Status = FileHandle->Close (FileHandle);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (*Buffer);\r
- DEBUG ((DEBUG_ERROR, "Can not close the token file !\n"));\r
- Status = EFI_DEVICE_ERROR;\r
- }\r
-\r
-Done:\r
-\r
- if (FileInfo != NULL) {\r
- FreePool (FileInfo);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Hash the data to get credential.\r
-\r
- @param[in] Buffer Points to the data buffer\r
- @param[in] BufferSize The size of data in buffer, in bytes.\r
- @param[out] Credential Points to the hashed result\r
-\r
- @retval TRUE Hash the data successfully.\r
- @retval FALSE Failed to hash the data.\r
-\r
-**/\r
-BOOLEAN\r
-GenerateCredential (\r
- IN UINT8 *Buffer,\r
- IN UINTN BufferSize,\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, Buffer, BufferSize);\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
- Read the token file, and default the Token is saved at the begining of the file.\r
-\r
- @param[out] Token Token read from a Token file.\r
-\r
- @retval EFI_SUCCESS Read a Token successfully.\r
- @retval Others Fails to read a Token.\r
-\r
-**/\r
-EFI_STATUS\r
-GetToken (\r
- OUT UINT8 *Token\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *Buffer;\r
- UINTN BufSize;\r
- CHAR16 *TokenFile;\r
-\r
- BufSize = 0;\r
- Buffer = NULL;\r
- TokenFile = PcdGetPtr (PcdFixedUsbCredentialProviderTokenFileName);\r
- Status = GetFileData (TokenFile, (VOID *)&Buffer, &BufSize);\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Read file %s from USB error! Status=(%r)\n", TokenFile, Status));\r
- return Status;\r
- }\r
-\r
- if (!GenerateCredential (Buffer, BufSize, Token)) {\r
- DEBUG ((DEBUG_ERROR, "Generate credential from read data failed!\n"));\r
- FreePool (Buffer);\r
- return EFI_SECURITY_VIOLATION;\r
- }\r
-\r
- FreePool (Buffer);\r
- return EFI_SUCCESS;\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
- record. 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 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
- USB_PROVIDER_CALLBACK_INFO *CallbackInfo;\r
-\r
- //\r
- // Initialize driver private data.\r
- //\r
- CallbackInfo = AllocateZeroPool (sizeof (USB_PROVIDER_CALLBACK_INFO));\r
- if (CallbackInfo == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- CallbackInfo->DriverHandle = NULL;\r
-\r
- //\r
- // Publish HII data.\r
- //\r
- CallbackInfo->HiiHandle = HiiAddPackages (\r
- &gUsbCredentialProviderGuid,\r
- CallbackInfo->DriverHandle,\r
- UsbCredentialProviderStrings,\r
- NULL\r
- );\r
- if (CallbackInfo->HiiHandle == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- mCallbackInfo = CallbackInfo;\r
-\r
- return EFI_SUCCESS;\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
- USB_INFO UsbInfo;\r
- EFI_USER_INFO *UserInfo;\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 (UsbInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof (EFI_USER_INFO_IDENTIFIER));\r
- FreePool (UserInfo);\r
-\r
- //\r
- // Get Token and User ID to UsbInfo.\r
- //\r
- Status = GetToken (UsbInfo.Token);\r
- if (EFI_ERROR (Status)) {\r
- QuestionStr = GetStringById (STRING_TOKEN (STR_READ_USB_TOKEN_ERROR));\r
- PromptStr = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));\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
- return Status;\r
- }\r
-\r
- //\r
- // Check whether User is ever enrolled in the provider.\r
- //\r
- for (Index = 0; Index < mUsbTable->Count; Index++) {\r
- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
- if (CompareMem (UserId, (UINT8 *) &UsbInfo.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, &UsbInfo);\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
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Returns bitmap used to describe the credential provider type.\r
-\r
- This optional function returns a bitmap which 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
- // 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
- UINT8 *UserToken;\r
- UINT8 ReadToken[HASHED_CREDENTIAL_LEN];\r
- EFI_INPUT_KEY Key;\r
- CHAR16 *QuestionStr;\r
- CHAR16 *PromptStr;\r
-\r
- if ((This == NULL) || (Identifier == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (User == NULL) {\r
- //\r
- // Verify the auto logon user, get user id by matched token.\r
- //\r
- if (mUsbTable->Count == 0) {\r
- return EFI_NOT_READY;\r
- }\r
-\r
- //\r
- // No user selected, get token first and verify the user existed in user database.\r
- //\r
- Status = GetToken (ReadToken);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_READY;\r
- }\r
-\r
- for (Index = 0; Index < mUsbTable->Count; Index++) {\r
- //\r
- // find the specified credential in the Usb credential database.\r
- //\r
- UserToken = mUsbTable->UserInfo[Index].Token;\r
- if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) == 0) {\r
- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_READY;\r
- }\r
-\r
- //\r
- // User is not NULL here. Read a token, and check whether the token matches with\r
- // the selected user's Token. If not, try to find a token in token DB to matches\r
- // with read token.\r
- //\r
-\r
- Status = GetToken (ReadToken);\r
- if (EFI_ERROR (Status)) {\r
- QuestionStr = GetStringById (STRING_TOKEN (STR_READ_USB_TOKEN_ERROR));\r
- PromptStr = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));\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
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Get the selected user's identifier.\r
- //\r
- Status = FindUserInfoByType (User, EFI_USER_INFO_IDENTIFIER_RECORD, &UserInfo);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Check the selected user's Token with the read token.\r
- //\r
- for (Index = 0; Index < mUsbTable->Count; Index++) {\r
- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
- NewUserId = (UINT8 *) (UserInfo + 1);\r
- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
- //\r
- // The user's ID is found in the UsbTable.\r
- //\r
- UserToken = mUsbTable->UserInfo[Index].Token;\r
- if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) == 0) {\r
- //\r
- // The read token matches with the one in UsbTable.\r
- //\r
- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
- FreePool (UserInfo);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
-\r
- FreePool (UserInfo);\r
-\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
-\r
- *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT | EFI_CREDENTIAL_LOGON_FLAG_AUTO;\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
-\r
- *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT | EFI_CREDENTIAL_LOGON_FLAG_AUTO;\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) || (mUsbInfoHandle == NULL)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Find information handle in credential info table.\r
- //\r
- for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {\r
- CredentialInfo = mUsbInfoHandle->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
-\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 (mUsbInfoHandle == NULL) {\r
- //\r
- // Initilized user info table. There are 4 user info records in the table.\r
- //\r
- InfoLen = sizeof (USB_CREDENTIAL_INFO) + (4 - 1) * sizeof (EFI_USER_INFO *);\r
- mUsbInfoHandle = AllocateZeroPool (InfoLen);\r
- if (mUsbInfoHandle == 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, &gUsbCredentialProviderGuid);\r
- CopyGuid ((EFI_GUID *)(Info + 1), &gUsbCredentialProviderGuid);\r
-\r
- mUsbInfoHandle->Info[0] = Info;\r
- mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
- FreePool (ProvNameStr);\r
-\r
- mUsbInfoHandle->Info[1] = Info;\r
- mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
- CopyGuid ((EFI_GUID *)(Info + 1), &gEfiUserCredentialClassSecureCardGuid);\r
-\r
- mUsbInfoHandle->Info[2] = Info;\r
- mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
- FreePool (ProvNameStr);\r
-\r
- mUsbInfoHandle->Info[3] = Info;\r
- mUsbInfoHandle->Count++;\r
- }\r
-\r
- if (*UserInfo == NULL) {\r
- //\r
- // Return the first info handle.\r
- //\r
- *UserInfo = (EFI_USER_INFO_HANDLE) mUsbInfoHandle->Info[0];\r
- return EFI_SUCCESS;\r
- }\r
-\r
- //\r
- // Find information handle in credential info table.\r
- //\r
- for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {\r
- Info = mUsbInfoHandle->Info[Index];\r
- if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {\r
- //\r
- // The handle is found, get the next one.\r
- //\r
- if (Index == mUsbInfoHandle->Count - 1) {\r
- //\r
- // Already last one.\r
- //\r
- *UserInfo = NULL;\r
- return EFI_NOT_FOUND;\r
- }\r
- Index++;\r
- *UserInfo = (EFI_USER_INFO_HANDLE)mUsbInfoHandle->Info[Index];\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- *UserInfo = NULL;\r
- return EFI_NOT_FOUND;\r
-}\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 < mUsbTable->Count; Index++) {\r
- UserId = (UINT8 *) &mUsbTable->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
-UsbProviderInit (\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 Usb Credential Provider.\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
- &mCallbackInfo->DriverHandle,\r
- &gEfiUserCredential2ProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &gUsbCredentialProviderDriver\r
- );\r
- return Status;\r
-}\r