From: "Gao, Liming" <liming.gao@intel.com>
To: "Chen, Chen A" <chen.a.chen@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Zhang, Chao B" <chao.b.zhang@intel.com>
Subject: Re: [PATCH] SecurityPkg: Remove code under UserIdentification folder.
Date: Wed, 9 Jan 2019 01:38:44 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E3ADF77@SHSMSX152.ccr.corp.intel.com> (raw)
In-Reply-To: <20190109010913.29524-1-chen.a.chen@intel.com>
Could you create BZ for this change?
>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>chenche4
>Sent: Wednesday, January 09, 2019 9:09 AM
>To: edk2-devel@lists.01.org
>Cc: Zhang, Chao B <chao.b.zhang@intel.com>
>Subject: [edk2] [PATCH] SecurityPkg: Remove code under UserIdentification
>folder.
>
>1. UserIdentifyManagerDxe is used to provide UserManagerProtocol.
>2. UserProfileManagerDxe provide UI setting
>3. PwdCredentialProviderDxe & UsbCredentialProviderDxe are
>implementation
> examples.
>
>Remove above features because of no platform use it.
>
>Cc: Zhang Chao B <chao.b.zhang@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
>---
> .../Include/Guid/UsbCredentialProviderHii.h | 29 -
> SecurityPkg/Include/Guid/UserIdentifyManagerHii.h | 25 -
> SecurityPkg/Include/Guid/UserProfileManagerHii.h | 25 -
> SecurityPkg/SecurityPkg.dec | 12 -
> SecurityPkg/SecurityPkg.dsc | 4 -
> .../PwdCredentialProvider.c | 1464 --------
> .../PwdCredentialProvider.h | 374 --
> .../PwdCredentialProvider.uni | 21 -
> .../PwdCredentialProviderData.h | 30 -
> .../PwdCredentialProviderDxe.inf | 65 -
> .../PwdCredentialProviderExtra.uni | 19 -
> .../PwdCredentialProviderStrings.uni | 38 -
> .../PwdCredentialProviderVfr.Vfr | 34 -
> .../UsbCredentialProvider.c | 1410 --------
> .../UsbCredentialProvider.h | 361 --
> .../UsbCredentialProvider.uni | 23 -
> .../UsbCredentialProviderDxe.inf | 70 -
> .../UsbCredentialProviderExtra.uni | 19 -
> .../UsbCredentialProviderStrings.uni | 29 -
> .../UserIdentifyManagerDxe/LoadDeferredImage.c | 148 -
> .../UserIdentifyManagerDxe/UserIdentifyManager.c | 3766 --------------------
> .../UserIdentifyManagerDxe/UserIdentifyManager.h | 413 ---
> .../UserIdentifyManagerDxe/UserIdentifyManager.uni | 21 -
> .../UserIdentifyManagerData.h | 35 -
> .../UserIdentifyManagerDxe.inf | 79 -
> .../UserIdentifyManagerExtra.uni | 19 -
> .../UserIdentifyManagerStrings.uni | 27 -
> .../UserIdentifyManagerVfr.Vfr | 43 -
> .../UserProfileManagerDxe/ModifyAccessPolicy.c | 688 ----
> .../UserProfileManagerDxe/ModifyIdentityPolicy.c | 516 ---
> .../UserProfileManagerDxe/UserProfileAdd.c | 372 --
> .../UserProfileManagerDxe/UserProfileDelete.c | 343 --
> .../UserProfileManagerDxe/UserProfileManager.c | 887 -----
> .../UserProfileManagerDxe/UserProfileManager.h | 444 ---
> .../UserProfileManagerDxe/UserProfileManager.uni | 22 -
> .../UserProfileManagerDxe/UserProfileManagerData.h | 158 -
> .../UserProfileManagerDxe.inf | 72 -
> .../UserProfileManagerExtra.uni | 19 -
> .../UserProfileManagerStrings.uni | 158 -
> .../UserProfileManagerVfr.Vfr | 244 --
> .../UserProfileManagerDxe/UserProfileModify.c | 1475 --------
> 41 files changed, 14001 deletions(-)
> delete mode 100644 SecurityPkg/Include/Guid/UsbCredentialProviderHii.h
> delete mode 100644 SecurityPkg/Include/Guid/UserIdentifyManagerHii.h
> delete mode 100644 SecurityPkg/Include/Guid/UserProfileManagerHii.h
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>vider.c
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>vider.h
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>vider.uni
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderData.h
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderDxe.inf
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderExtra.uni
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderStrings.uni
> delete mode 100644
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderVfr.Vfr
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>vider.c
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>vider.h
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>vider.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>viderDxe.inf
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>viderExtra.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>viderStrings.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/LoadDeferredImag
>e.c
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>er.c
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>er.h
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>er.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>erData.h
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>erDxe.inf
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>erExtra.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>erStrings.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyManag
>erVfr.Vfr
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolicy.
>c
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPolicy
>.c
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.c
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager.
>c
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager.
>h
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager.
>uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager
>Data.h
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager
>Dxe.inf
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager
>Extra.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager
>Strings.uni
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManager
>Vfr.Vfr
> delete mode 100644
>SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileModify.c
>
>diff --git a/SecurityPkg/Include/Guid/UsbCredentialProviderHii.h
>b/SecurityPkg/Include/Guid/UsbCredentialProviderHii.h
>deleted file mode 100644
>index 059d68f32e..0000000000
>--- a/SecurityPkg/Include/Guid/UsbCredentialProviderHii.h
>+++ /dev/null
>@@ -1,29 +0,0 @@
>-/** @file
>- GUID used as HII Package list GUID in UsbCredentialProviderDxe driver.
>-
>-Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef __USB_CREDENTIAL_PROVIDER_HII_H__
>-#define __USB_CREDENTIAL_PROVIDER_HII_H__
>-
>-//
>-// Used for save password credential and form browser
>-// And used as provider identifier
>-//
>-#define USB_CREDENTIAL_PROVIDER_GUID \
>- { \
>- 0xd0849ed1, 0xa88c, 0x4ba6, { 0xb1, 0xd6, 0xab, 0x50, 0xe2, 0x80, 0xb7,
>0xa9 }\
>- }
>-
>-extern EFI_GUID gUsbCredentialProviderGuid;
>-
>-#endif
>diff --git a/SecurityPkg/Include/Guid/UserIdentifyManagerHii.h
>b/SecurityPkg/Include/Guid/UserIdentifyManagerHii.h
>deleted file mode 100644
>index 323c51f0f6..0000000000
>--- a/SecurityPkg/Include/Guid/UserIdentifyManagerHii.h
>+++ /dev/null
>@@ -1,25 +0,0 @@
>-/** @file
>- GUID used as HII FormSet and HII Package list GUID in
>UserIdentifyManagerDxe driver.
>-
>-Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef __USER_IDENTIFY_MANAGER_HII_H__
>-#define __USER_IDENTIFY_MANAGER_HII_H__
>-
>-#define USER_IDENTIFY_MANAGER_GUID \
>- { \
>- 0x3ccd3dd8, 0x8d45, 0x4fed, { 0x96, 0x2d, 0x2b, 0x38, 0xcd, 0x82, 0xb3,
>0xc4 } \
>- }
>-
>-extern EFI_GUID gUserIdentifyManagerGuid;
>-
>-#endif
>diff --git a/SecurityPkg/Include/Guid/UserProfileManagerHii.h
>b/SecurityPkg/Include/Guid/UserProfileManagerHii.h
>deleted file mode 100644
>index 105059350c..0000000000
>--- a/SecurityPkg/Include/Guid/UserProfileManagerHii.h
>+++ /dev/null
>@@ -1,25 +0,0 @@
>-/** @file
>- GUID used as HII FormSet and HII Package list GUID in
>UserProfileManagerDxe driver.
>-
>-Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef __USER_PROFILE_MANAGER_HII_H__
>-#define __USER_PROFILE_MANAGER_HII_H__
>-
>-#define USER_PROFILE_MANAGER_GUID \
>- { \
>- 0xc35f272c, 0x97c2, 0x465a, { 0xa2, 0x16, 0x69, 0x6b, 0x66, 0x8a, 0x8c, 0xfe }
>\
>- }
>-
>-extern EFI_GUID gUserProfileManagerGuid;
>-
>-#endif
>diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec
>index 8d64b4fefe..0c2afe2938 100644
>--- a/SecurityPkg/SecurityPkg.dec
>+++ b/SecurityPkg/SecurityPkg.dec
>@@ -139,22 +139,10 @@
> # Include/Guid/Tcg2PhysicalPresenceData.h
> gEfiTcg2PhysicalPresenceGuid = { 0xaeb9c5c1, 0x94f1, 0x4d02, { 0xbf, 0xd9,
>0x46, 0x2, 0xdb, 0x2d, 0x3c, 0x54 }}
>
>- ## GUID used for form browser, password credential and provider identifier.
>- # Include/Guid/PwdCredentialProviderHii.h
>- gPwdCredentialProviderGuid = { 0x78b9ec8b, 0xc000, 0x46c5, { 0xac,
>0x93, 0x24, 0xa0, 0xc1, 0xbb, 0x0, 0xce }}
>-
>- ## GUID used for form browser, USB credential and provider identifier.
>- # Include/Guid/UsbCredentialProviderHii.h
>- gUsbCredentialProviderGuid = { 0xd0849ed1, 0xa88c, 0x4ba6, { 0xb1,
>0xd6, 0xab, 0x50, 0xe2, 0x80, 0xb7, 0xa9 }}
>-
> ## GUID used for FormSet guid and user profile variable.
> # Include/Guid/UserIdentifyManagerHii.h
> gUserIdentifyManagerGuid = { 0x3ccd3dd8, 0x8d45, 0x4fed, { 0x96,
>0x2d, 0x2b, 0x38, 0xcd, 0x82, 0xb3, 0xc4 }}
>
>- ## GUID used for FormSet.
>- # Include/Guid/UserProfileManagerHii.h
>- gUserProfileManagerGuid = { 0xc35f272c, 0x97c2, 0x465a, { 0xa2, 0x16,
>0x69, 0x6b, 0x66, 0x8a, 0x8c, 0xfe }}
>-
> ## GUID used for FormSet.
> # Include/Guid/TcgConfigHii.h
> gTcgConfigFormSetGuid = { 0xb0f901e4, 0xc424, 0x45de, { 0x90, 0x81,
>0x95, 0xe2, 0xb, 0xde, 0x6f, 0xb5 }}
>diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc
>index 68a2953162..19aaebff1f 100644
>--- a/SecurityPkg/SecurityPkg.dsc
>+++ b/SecurityPkg/SecurityPkg.dsc
>@@ -146,8 +146,6 @@
> SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
> #SecurityPkg/Library/DxeDeferImageLoadLib/DxeDeferImageLoadLib.inf
>
>SecurityPkg/Library/DxeImageAuthenticationStatusLib/DxeImageAuthenticati
>onStatusLib.inf
>-
>#SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMana
>gerDxe.inf
>-
>#SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManage
>rDxe.inf
>
> #
> # TPM
>@@ -200,8 +198,6 @@
> SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf
>
> [Components.IA32, Components.X64]
>-#
>SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialPro
>viderDxe.inf
>-#
>SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPro
>viderDxe.inf
>
>SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfig
>Dxe.inf
>
> #
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.c
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>Provider.c
>deleted file mode 100644
>index 52fc68b5ee..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.c
>+++ /dev/null
>@@ -1,1464 +0,0 @@
>-/** @file
>- Password Credential Provider driver implementation.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "PwdCredentialProvider.h"
>-
>-CREDENTIAL_TABLE *mPwdTable = NULL;
>-PWD_PROVIDER_CALLBACK_INFO *mCallbackInfo = NULL;
>-PASSWORD_CREDENTIAL_INFO *mPwdInfoHandle = NULL;
>-
>-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
>- {
>- {
>- HARDWARE_DEVICE_PATH,
>- HW_VENDOR_DP,
>- {
>- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
>- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
>- }
>- },
>- PWD_CREDENTIAL_PROVIDER_GUID
>- },
>- {
>- END_DEVICE_PATH_TYPE,
>- END_ENTIRE_DEVICE_PATH_SUBTYPE,
>- {
>- (UINT8) (END_DEVICE_PATH_LENGTH),
>- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
>- }
>- }
>-};
>-
>-EFI_USER_CREDENTIAL2_PROTOCOL gPwdCredentialProviderDriver = {
>- PWD_CREDENTIAL_PROVIDER_GUID,
>- EFI_USER_CREDENTIAL_CLASS_PASSWORD,
>- CredentialEnroll,
>- CredentialForm,
>- CredentialTile,
>- CredentialTitle,
>- CredentialUser,
>- CredentialSelect,
>- CredentialDeselect,
>- CredentialDefault,
>- CredentialGetInfo,
>- CredentialGetNextInfo,
>- EFI_CREDENTIAL_CAPABILITIES_ENROLL,
>- CredentialDelete
>-};
>-
>-
>-/**
>- Get string by string id from HII Interface.
>-
>-
>- @param[in] Id String ID to get the string from.
>-
>- @retval CHAR16 * String from ID.
>- @retval NULL If error occurs.
>-
>-**/
>-CHAR16 *
>-GetStringById (
>- IN EFI_STRING_ID Id
>- )
>-{
>- //
>- // Get the current string for the current Language.
>- //
>- return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL);
>-}
>-
>-
>-/**
>- Expand password table size.
>-
>-**/
>-VOID
>-ExpandTableSize (
>- VOID
>- )
>-{
>- CREDENTIAL_TABLE *NewTable;
>- UINTN Count;
>-
>- Count = mPwdTable->MaxCount + PASSWORD_TABLE_INC;
>- //
>- // Create new credential table.
>- //
>- NewTable = (CREDENTIAL_TABLE *) AllocateZeroPool (
>- sizeof (CREDENTIAL_TABLE) +
>- (Count - 1) * sizeof (PASSWORD_INFO)
>- );
>- ASSERT (NewTable != NULL);
>-
>- NewTable->MaxCount = Count;
>- NewTable->Count = mPwdTable->Count;
>- NewTable->ValidIndex = mPwdTable->ValidIndex;
>- //
>- // Copy old entries
>- //
>- CopyMem (
>- &NewTable->UserInfo,
>- &mPwdTable->UserInfo,
>- mPwdTable->Count * sizeof (PASSWORD_INFO)
>- );
>- FreePool (mPwdTable);
>- mPwdTable = NewTable;
>-}
>-
>-
>-/**
>- Add, update or delete info in table, and sync with NV variable.
>-
>- @param[in] Index The index of the password in table. If index is found in
>- table, update the info, else add the into to table.
>- @param[in] Info The new password info to add into table.If Info is NULL,
>- delete the info by Index.
>-
>- @retval EFI_INVALID_PARAMETER Info is NULL when save the info.
>- @retval EFI_SUCCESS Modify the table successfully.
>- @retval Others Failed to modify the table.
>-
>-**/
>-EFI_STATUS
>-ModifyTable (
>- IN UINTN Index,
>- IN PASSWORD_INFO * Info OPTIONAL
>- )
>-{
>- EFI_STATUS Status;
>- PASSWORD_INFO *NewPasswordInfo;
>-
>- NewPasswordInfo = NULL;
>-
>- if (Index < mPwdTable->Count) {
>- if (Info == NULL) {
>- //
>- // Delete the specified entry.
>- //
>- mPwdTable->Count--;
>- if (Index != mPwdTable->Count) {
>- NewPasswordInfo = &mPwdTable->UserInfo[mPwdTable->Count];
>- }
>- } else {
>- //
>- // Update the specified entry.
>- //
>- NewPasswordInfo = Info;
>- }
>- } else {
>- //
>- // Add a new password info.
>- //
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mPwdTable->Count >= mPwdTable->MaxCount) {
>- ExpandTableSize ();
>- }
>-
>- NewPasswordInfo = Info;
>- mPwdTable->Count++;
>- }
>-
>- if (NewPasswordInfo != NULL) {
>- CopyMem (&mPwdTable->UserInfo[Index], NewPasswordInfo, sizeof
>(PASSWORD_INFO));
>- }
>-
>- //
>- // Save the credential table.
>- //
>- Status = gRT->SetVariable (
>- L"PwdCredential",
>- &gPwdCredentialProviderGuid,
>- EFI_VARIABLE_NON_VOLATILE |
>EFI_VARIABLE_BOOTSERVICE_ACCESS,
>- mPwdTable->Count * sizeof (PASSWORD_INFO),
>- &mPwdTable->UserInfo
>- );
>- return Status;
>-}
>-
>-
>-/**
>- Create a password table.
>-
>- @retval EFI_SUCCESS Create a password table successfully.
>- @retval Others Failed to create a password.
>-
>-**/
>-EFI_STATUS
>-InitCredentialTable (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 *Var;
>- UINTN VarSize;
>-
>- //
>- // Get Password credential data from NV variable.
>- //
>- VarSize = 0;
>- Var = NULL;
>- Status = gRT->GetVariable (
>- L"PwdCredential",
>- &gPwdCredentialProviderGuid,
>- NULL,
>- &VarSize,
>- Var
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- Var = AllocateZeroPool (VarSize);
>- if (Var == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = gRT->GetVariable (
>- L"PwdCredential",
>- &gPwdCredentialProviderGuid,
>- NULL,
>- &VarSize,
>- Var
>- );
>- }
>- if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
>- return Status;
>- }
>-
>- //
>- // Create the password credential table.
>- //
>- mPwdTable = AllocateZeroPool (
>- sizeof (CREDENTIAL_TABLE) - sizeof (PASSWORD_INFO) +
>- PASSWORD_TABLE_INC * sizeof (PASSWORD_INFO) +
>- VarSize
>- );
>- if (mPwdTable == NULL) {
>- FreePool (Var);
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- mPwdTable->Count = VarSize / sizeof (PASSWORD_INFO);
>- mPwdTable->MaxCount = mPwdTable->Count + PASSWORD_TABLE_INC;
>- mPwdTable->ValidIndex = 0;
>- if (Var != NULL) {
>- CopyMem (mPwdTable->UserInfo, Var, VarSize);
>- FreePool (Var);
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Hash the password to get credential.
>-
>- @param[in] Password Points to the input password.
>- @param[in] PasswordSize The size of password, in bytes.
>- @param[out] Credential Points to the hashed result.
>-
>- @retval TRUE Hash the password successfully.
>- @retval FALSE Failed to hash the password.
>-
>-**/
>-BOOLEAN
>-GenerateCredential (
>- IN CHAR16 *Password,
>- IN UINTN PasswordSize,
>- OUT UINT8 *Credential
>- )
>-{
>- BOOLEAN Status;
>- UINTN HashSize;
>- VOID *Hash;
>-
>- HashSize = Sha1GetContextSize ();
>- Hash = AllocatePool (HashSize);
>- ASSERT (Hash != NULL);
>-
>- Status = Sha1Init (Hash);
>- if (!Status) {
>- goto Done;
>- }
>-
>- Status = Sha1Update (Hash, Password, PasswordSize);
>- if (!Status) {
>- goto Done;
>- }
>-
>- Status = Sha1Final (Hash, Credential);
>-
>-Done:
>- FreePool (Hash);
>- return Status;
>-}
>-
>-
>-/**
>- Get password from user input.
>-
>- @param[in] FirstPwd If True, prompt to input the first password.
>- If False, prompt to input password again.
>- @param[out] Credential Points to the input password.
>-
>-**/
>-VOID
>-GetPassword (
>- IN BOOLEAN FirstPwd,
>- OUT CHAR8 *Credential
>- )
>-{
>- EFI_INPUT_KEY Key;
>- CHAR16 PasswordMask[CREDENTIAL_LEN + 1];
>- CHAR16 Password[CREDENTIAL_LEN];
>- UINTN PasswordLen;
>- CHAR16 *QuestionStr;
>- CHAR16 *LineStr;
>-
>- PasswordLen = 0;
>- while (TRUE) {
>- PasswordMask[PasswordLen] = L'_';
>- PasswordMask[PasswordLen + 1] = L'\0';
>- LineStr = GetStringById (STRING_TOKEN (STR_DRAW_A_LINE));
>- if (FirstPwd) {
>- QuestionStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD));
>- } else {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_INPUT_PASSWORD_AGAIN));
>- }
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- LineStr,
>- PasswordMask,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (LineStr);
>-
>- //
>- // Check key stroke
>- //
>- if (Key.ScanCode == SCAN_NULL) {
>- if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
>- break;
>- } else if (Key.UnicodeChar == CHAR_BACKSPACE) {
>- if (PasswordLen > 0) {
>- PasswordLen--;
>- }
>- } else if ((Key.UnicodeChar == CHAR_NULL) ||
>- (Key.UnicodeChar == CHAR_TAB) ||
>- (Key.UnicodeChar == CHAR_LINEFEED)) {
>- continue;
>- } else {
>- Password[PasswordLen] = Key.UnicodeChar;
>- PasswordMask[PasswordLen] = L'*';
>- PasswordLen++;
>- if (PasswordLen == CREDENTIAL_LEN) {
>- break;
>- }
>- }
>- }
>- }
>-
>- PasswordLen = PasswordLen * sizeof (CHAR16);
>- GenerateCredential (Password, PasswordLen, (UINT8 *)Credential);
>-}
>-
>-/**
>- Check whether the password can be found on this provider.
>-
>- @param[in] Password The password to be found.
>-
>- @retval EFI_SUCCESS Found password sucessfully.
>- @retval EFI_NOT_FOUND Fail to find the password.
>-
>-**/
>-EFI_STATUS
>-CheckPassword (
>- IN CHAR8 *Password
>- )
>-{
>- UINTN Index;
>- CHAR8 *Pwd;
>-
>- //
>- // Check password credential.
>- //
>- mPwdTable->ValidIndex = 0;
>- for (Index = 0; Index < mPwdTable->Count; Index++) {
>- Pwd = mPwdTable->UserInfo[Index].Password;
>- if (CompareMem (Pwd, Password, CREDENTIAL_LEN) == 0) {
>- mPwdTable->ValidIndex = Index + 1;
>- return EFI_SUCCESS;
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Find a user infomation record by the information record type.
>-
>- This function searches all user information records of User from beginning
>- until either the information is found, or there are no more user infomation
>- records. A match occurs when a Info.InfoType field matches the user
>information
>- record type.
>-
>- @param[in] User Points to the user profile record to search.
>- @param[in] InfoType The infomation type to be searched.
>- @param[out] Info Points to the user info found, the caller is responsible
>- to free.
>-
>- @retval EFI_SUCCESS Find the user information successfully.
>- @retval Others Fail to find the user information.
>-
>-**/
>-EFI_STATUS
>-FindUserInfoByType (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT8 InfoType,
>- OUT EFI_USER_INFO **Info
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINTN UserInfoSize;
>- EFI_USER_INFO_HANDLE UserInfoHandle;
>- EFI_USER_MANAGER_PROTOCOL *UserManager;
>-
>- //
>- // Find user information by information type.
>- //
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- Status = gBS->LocateProtocol (
>- &gEfiUserManagerProtocolGuid,
>- NULL,
>- (VOID **) &UserManager
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Get each user information.
>- //
>-
>- UserInfoHandle = NULL;
>- UserInfo = NULL;
>- UserInfoSize = 0;
>- while (TRUE) {
>- Status = UserManager->GetNextInfo (UserManager, User,
>&UserInfoHandle);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- //
>- // Get information.
>- //
>- Status = UserManager->GetInfo (
>- UserManager,
>- User,
>- UserInfoHandle,
>- UserInfo,
>- &UserInfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- if (UserInfo != NULL) {
>- FreePool (UserInfo);
>- }
>- UserInfo = AllocateZeroPool (UserInfoSize);
>- if (UserInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = UserManager->GetInfo (
>- UserManager,
>- User,
>- UserInfoHandle,
>- UserInfo,
>- &UserInfoSize
>- );
>- }
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- ASSERT (UserInfo != NULL);
>- if (UserInfo->InfoType == InfoType) {
>- *Info = UserInfo;
>- return EFI_SUCCESS;
>- }
>- }
>-
>- if (UserInfo != NULL) {
>- FreePool (UserInfo);
>- }
>- return Status;
>-}
>-
>-
>-/**
>- This function processes the results of changes in configuration.
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Action Specifies the type of action taken by the browser.
>- @param QuestionId A unique value which is sent to the original
>- exporting driver so that it can identify the type
>- of data to expect.
>- @param Type The type of value for the question.
>- @param Value A pointer to the data being sent to the original
>- exporting driver.
>- @param ActionRequest On return, points to the action requested by
>the
>- callback function.
>-
>- @retval EFI_SUCCESS The callback successfully handled the action.
>- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
>the
>- variable and its data.
>- @retval EFI_DEVICE_ERROR The variable could not be saved.
>- @retval EFI_UNSUPPORTED The specified Action is not supported by the
>- callback.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDriverCallback (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN EFI_BROWSER_ACTION Action,
>- IN EFI_QUESTION_ID QuestionId,
>- IN UINT8 Type,
>- IN EFI_IFR_TYPE_VALUE *Value,
>- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
>- )
>-{
>- EFI_STATUS Status;
>- EFI_INPUT_KEY Key;
>- CHAR8 Password[CREDENTIAL_LEN];
>- CHAR16 *PromptStr;
>-
>- if (Action == EFI_BROWSER_ACTION_CHANGED) {
>- if (QuestionId == KEY_GET_PASSWORD) {
>- //
>- // Get and check password.
>- //
>- GetPassword (TRUE, Password);
>- Status = CheckPassword (Password);
>- if (EFI_ERROR (Status)) {
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_PASSWORD_INCORRECT));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"",
>- PromptStr,
>- L"",
>- NULL
>- );
>- FreePool (PromptStr);
>- return Status;
>- }
>- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
>- }
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // All other action return unsupported.
>- //
>- return EFI_UNSUPPORTED;
>-}
>-
>-
>-/**
>- This function allows a caller to extract the current configuration for one
>- or more named elements from the target driver.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Request A null-terminated Unicode string in <ConfigRequest>
>format.
>- @param Progress On return, points to a character in the Request string.
>- Points to the string's null terminator if request was successful.
>- Points to the most recent '&' before the first failing name/value
>- pair (or the beginning of the string if the failure is in the
>- first name/value pair) if the request was not successful.
>- @param Results A null-terminated Unicode string in <ConfigAltResp>
>format which
>- has all values filled in for the names in the Request string.
>- String to be allocated by the called function.
>-
>- @retval EFI_SUCCESS The Results is filled with the requested values.
>- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
>results.
>- @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown
>name.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeExtractConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Request,
>- OUT EFI_STRING *Progress,
>- OUT EFI_STRING *Results
>- )
>-{
>- if (Progress == NULL || Results == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- *Progress = Request;
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- This function processes the results of changes in configuration.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Configuration A null-terminated Unicode string in <ConfigResp>
>format.
>- @param Progress A pointer to a string filled in with the offset of the
>most
>- recent '&' before the first failing name/value pair (or the
>- beginning of the string if the failure is in the first
>- name/value pair) or the terminating NULL if all was successful.
>-
>- @retval EFI_SUCCESS The Results is processed successfully.
>- @retval EFI_INVALID_PARAMETER Configuration is NULL.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeRouteConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Configuration,
>- OUT EFI_STRING *Progress
>- )
>-{
>- if (Configuration == NULL || Progress == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *Progress = Configuration;
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- This function initialize the data mainly used in form browser.
>-
>- @retval EFI_SUCCESS Initialize form data successfully.
>- @retval Others Fail to Initialize form data.
>-
>-**/
>-EFI_STATUS
>-InitFormBrowser (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- PWD_PROVIDER_CALLBACK_INFO *CallbackInfo;
>-
>- //
>- // Initialize driver private data.
>- //
>- CallbackInfo = AllocateZeroPool (sizeof (PWD_PROVIDER_CALLBACK_INFO));
>- if (CallbackInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- CallbackInfo->Signature = PWD_PROVIDER_SIGNATURE;
>- CallbackInfo->ConfigAccess.ExtractConfig = FakeExtractConfig;
>- CallbackInfo->ConfigAccess.RouteConfig = FakeRouteConfig;
>- CallbackInfo->ConfigAccess.Callback = CredentialDriverCallback;
>- CallbackInfo->DriverHandle = NULL;
>-
>- //
>- // Install Device Path Protocol and Config Access protocol to driver handle.
>- //
>- Status = gBS->InstallMultipleProtocolInterfaces (
>- &CallbackInfo->DriverHandle,
>- &gEfiDevicePathProtocolGuid,
>- &mHiiVendorDevicePath,
>- &gEfiHiiConfigAccessProtocolGuid,
>- &CallbackInfo->ConfigAccess,
>- NULL
>- );
>- ASSERT_EFI_ERROR (Status);
>-
>- //
>- // Publish HII data.
>- //
>- CallbackInfo->HiiHandle = HiiAddPackages (
>- &gPwdCredentialProviderGuid,
>- CallbackInfo->DriverHandle,
>- PwdCredentialProviderStrings,
>- PwdCredentialProviderVfrBin,
>- NULL
>- );
>- if (CallbackInfo->HiiHandle == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- mCallbackInfo = CallbackInfo;
>-
>- return Status;
>-}
>-
>-
>-/**
>- Enroll a user on a credential provider.
>-
>- This function enrolls a user on this credential provider. If the user exists on
>- this credential provider, update the user information on this credential
>provider;
>- otherwise add the user information on credential provider.
>-
>- @param[in] This Points to this instance of
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile to enroll.
>-
>- @retval EFI_SUCCESS User profile was successfully enrolled.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>enrollment on the
>- user profile handle. Either the user profile cannot enroll
>- on any user profile or cannot enroll on a user profile
>- other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>enrollment in
>- the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be created
>because of a device
>- error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialEnroll (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- PASSWORD_INFO PwdInfo;
>- EFI_USER_INFO *UserInfo;
>- CHAR8 Password[CREDENTIAL_LEN];
>- EFI_INPUT_KEY Key;
>- UINT8 *UserId;
>- CHAR16 *QuestionStr;
>- CHAR16 *PromptStr;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Get User Identifier.
>- //
>- UserInfo = NULL;
>- Status = FindUserInfoByType (
>- User,
>- EFI_USER_INFO_IDENTIFIER_RECORD,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- CopyMem (PwdInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof
>(EFI_USER_INFO_IDENTIFIER));
>- FreePool (UserInfo);
>-
>- //
>- // Get password from user.
>- //
>- while (TRUE) {
>- //
>- // Input password.
>- //
>- GetPassword (TRUE, PwdInfo.Password);
>-
>- //
>- // Input password again.
>- //
>- GetPassword (FALSE, Password);
>-
>- //
>- // Compare the two password consistency.
>- //
>- if (CompareMem (PwdInfo.Password, Password, CREDENTIAL_LEN) == 0) {
>- break;
>- }
>-
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_PASSWORD_MISMATCH));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_INPUT_PASSWORD_AGAIN));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>- }
>-
>- //
>- // Check whether User is ever enrolled in the provider.
>- //
>- for (Index = 0; Index < mPwdTable->Count; Index++) {
>- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;
>- if (CompareMem (UserId, (UINT8 *) &PwdInfo.UserId, sizeof
>(EFI_USER_INFO_IDENTIFIER)) == 0) {
>- //
>- // User already exists, update the password.
>- //
>- break;
>- }
>- }
>-
>- //
>- // Enroll the User to the provider.
>- //
>- Status = ModifyTable (Index, &PwdInfo);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Returns the user interface information used during user identification.
>-
>- This function returns information about the form used when interacting
>with the
>- user during user identification. The form is the first enabled form in the
>form-set
>- class EFI_HII_USER_CREDENTIAL_FORMSET_GUID installed on the HII
>handle HiiHandle. If
>- the user credential provider does not require a form to identify the user,
>then this
>- function should return EFI_NOT_FOUND.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] FormSetId On return, holds the identifier of the form set
>which contains
>- the form used during user identification.
>- @param[out] FormId On return, holds the identifier of the form used
>during user
>- identification.
>-
>- @retval EFI_SUCCESS Form returned successfully.
>- @retval EFI_NOT_FOUND Form not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or FormSetId is NULL or
>FormId is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialForm (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_GUID *FormSetId,
>- OUT EFI_FORM_ID *FormId
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) ||
>- (FormSetId == NULL) || (FormId == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *Hii = mCallbackInfo->HiiHandle;
>- *FormId = FORMID_GET_PASSWORD_FORM;
>- CopyGuid (FormSetId, &gPwdCredentialProviderGuid);
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Returns bitmap used to describe the credential provider type.
>-
>- This optional function returns a bitmap that is less than or equal to the
>number
>- of pixels specified by Width and Height. If no such bitmap exists, then
>EFI_NOT_FOUND
>- is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] Width On entry, points to the desired bitmap width. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- width of the bitmap returned.
>- @param[in, out] Height On entry, points to the desired bitmap height. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- height of the bitmap returned
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] Image On return, holds the HII image identifier.
>-
>- @retval EFI_SUCCESS Image identifier returned successfully.
>- @retval EFI_NOT_FOUND Image identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or Image is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTile (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT UINTN *Width,
>- IN OUT UINTN *Height,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_IMAGE_ID *Image
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) || (Image == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Returns string used to describe the credential provider type.
>-
>- This function returns a string which describes the credential provider. If no
>- such string exists, then EFI_NOT_FOUND is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] String On return, holds the HII string identifier.
>-
>- @retval EFI_SUCCESS String identifier returned successfully.
>- @retval EFI_NOT_FOUND String identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or String is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTitle (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_STRING_ID *String
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) || (String == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Set Hii handle and String ID.
>- //
>- *Hii = mCallbackInfo->HiiHandle;
>- *String = STRING_TOKEN (STR_CREDENTIAL_TITLE);
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return the user identifier associated with the currently authenticated user.
>-
>- This function returns the user identifier of the user authenticated by this
>credential
>- provider. This function is called after the credential-related information has
>been
>- submitted on a form, OR after a call to Default() has returned that this
>credential is
>- ready to log on.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle of the user profile currently
>being
>- considered by the user identity manager. If NULL, then no user
>- profile is currently under consideration.
>- @param[out] Identifier On return, points to the user identifier.
>-
>- @retval EFI_SUCCESS User identifier returned successfully.
>- @retval EFI_NOT_READY No user identifier can be returned.
>- @retval EFI_ACCESS_DENIED The user has been locked out of this user
>credential.
>- @retval EFI_INVALID_PARAMETER This is NULL, or Identifier is NULL.
>- @retval EFI_NOT_FOUND User is not NULL, and the specified user
>handle can't be
>- found in user profile database
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialUser (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- OUT EFI_USER_INFO_IDENTIFIER *Identifier
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- EFI_USER_INFO *UserInfo;
>- UINT8 *UserId;
>- UINT8 *NewUserId;
>- CHAR8 *Pwd;
>- CHAR8 *NewPwd;
>-
>- if ((This == NULL) || (Identifier == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mPwdTable->ValidIndex == 0) {
>- //
>- // No password input, or the input password doesn't match
>- // anyone in PwdTable.
>- //
>- return EFI_NOT_READY;
>- }
>-
>- if (User == NULL) {
>- //
>- // Return the user ID whose password matches the input password.
>- //
>- CopyMem (
>- Identifier,
>- &mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].UserId,
>- sizeof (EFI_USER_INFO_IDENTIFIER)
>- );
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Get the User's ID.
>- //
>- Status = FindUserInfoByType (
>- User,
>- EFI_USER_INFO_IDENTIFIER_RECORD,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Check whether the input password matches one in PwdTable.
>- //
>- for (Index = 0; Index < mPwdTable->Count; Index++) {
>- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;
>- NewUserId = (UINT8 *) (UserInfo + 1);
>- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER))
>== 0) {
>- Pwd = mPwdTable->UserInfo[Index].Password;
>- NewPwd = mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].Password;
>- if (CompareMem (Pwd, NewPwd, CREDENTIAL_LEN) == 0) {
>- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));
>- FreePool (UserInfo);
>- return EFI_SUCCESS;
>- }
>- }
>- }
>-
>- FreePool (UserInfo);
>- return EFI_NOT_READY;
>-}
>-
>-
>-/**
>- Indicate that user interface interaction has begun for the specified
>credential.
>-
>- This function is called when a credential provider is selected by the user. If
>- AutoLogon returns FALSE, then the user interface will be constructed by the
>User
>- Identity Manager.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, points to the credential provider's
>capabilities
>- after the credential provider has been selected by the user.
>-
>- @retval EFI_SUCCESS Credential provider successfully selected.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialSelect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- )
>-{
>- if ((This == NULL) || (AutoLogon == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- *AutoLogon = 0;
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Indicate that user interface interaction has ended for the specified
>credential.
>-
>- This function is called when a credential provider is deselected by the user.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>-
>- @retval EFI_SUCCESS Credential provider successfully deselected.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDeselect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This
>- )
>-{
>- if (This == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return the default logon behavior for this user credential.
>-
>- This function reports the default login behavior regarding this credential
>provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, holds whether the credential provider
>should be used
>- by default to automatically log on the user.
>-
>- @retval EFI_SUCCESS Default information successfully returned.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDefault (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- )
>-{
>- if ((This == NULL) || (AutoLogon == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- *AutoLogon = 0;
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return information attached to the credential provider.
>-
>- This function returns user information.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] UserInfo Handle of the user information data record.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes. On
>- exit, holds the user information. If the buffer is too small
>- to hold the information, then EFI_BUFFER_TOO_SMALL is
>returned
>- and InfoSize is updated to contain the number of bytes
>actually
>- required.
>- @param[in, out] InfoSize On entry, points to the size of Info. On return,
>points to the
>- size of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_BUFFER_TOO_SMALL The size specified by InfoSize is too small
>to hold all of the
>- user information. The size required is returned in *InfoSize.
>- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
>- @retval EFI_NOT_FOUND The specified UserInfo does not refer to a
>valid user info handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- )
>-{
>- EFI_USER_INFO *CredentialInfo;
>- UINTN Index;
>-
>- if ((This == NULL) || (InfoSize == NULL) || (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if ((UserInfo == NULL) || (mPwdInfoHandle == NULL)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Find information handle in credential info table.
>- //
>- for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {
>- CredentialInfo = mPwdInfoHandle->Info[Index];
>- if (UserInfo == (EFI_USER_INFO_HANDLE)CredentialInfo) {
>- //
>- // The handle is found, copy the user info.
>- //
>- if (CredentialInfo->InfoSize > *InfoSize) {
>- *InfoSize = CredentialInfo->InfoSize;
>- return EFI_BUFFER_TOO_SMALL;
>- }
>- CopyMem (Info, CredentialInfo, CredentialInfo->InfoSize);
>- return EFI_SUCCESS;
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Enumerate all of the user informations on the credential provider.
>-
>- This function returns the next user information record. To retrieve the first
>user
>- information record handle, point UserInfo at a NULL. Each subsequent call
>will retrieve
>- another user information record handle until there are no more, at which
>point UserInfo
>- will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] UserInfo On entry, points to the previous user information
>handle or NULL
>- to start enumeration. On exit, points to the next user
>information
>- handle or NULL if there is no more user information.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetNextInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- )
>-{
>- EFI_USER_INFO *Info;
>- CHAR16 *ProvNameStr;
>- UINTN InfoLen;
>- UINTN Index;
>- UINTN ProvStrLen;
>-
>- if ((This == NULL) || (UserInfo == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mPwdInfoHandle == NULL) {
>- //
>- // Initilized user info table. There are 4 user info records in the table.
>- //
>- InfoLen = sizeof (PASSWORD_CREDENTIAL_INFO) + (4 - 1) * sizeof
>(EFI_USER_INFO *);
>- mPwdInfoHandle = AllocateZeroPool (InfoLen);
>- if (mPwdInfoHandle == NULL) {
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // The first information, Credential Provider info.
>- //
>- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType = EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);
>- CopyGuid ((EFI_GUID *)(Info + 1), &gPwdCredentialProviderGuid);
>-
>- mPwdInfoHandle->Info[0] = Info;
>- mPwdInfoHandle->Count++;
>-
>- //
>- // The second information, Credential Provider name info.
>- //
>- ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_NAME));
>- ProvStrLen = StrSize (ProvNameStr);
>- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType =
>EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);
>- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);
>- FreePool (ProvNameStr);
>-
>- mPwdInfoHandle->Info[1] = Info;
>- mPwdInfoHandle->Count++;
>-
>- //
>- // The third information, Credential Provider type info.
>- //
>- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType = EFI_USER_INFO_CREDENTIAL_TYPE_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);
>- CopyGuid ((EFI_GUID *)(Info + 1), &gEfiUserCredentialClassPasswordGuid);
>-
>- mPwdInfoHandle->Info[2] = Info;
>- mPwdInfoHandle->Count++;
>-
>- //
>- // The fourth information, Credential Provider type name info.
>- //
>- ProvNameStr = GetStringById (STRING_TOKEN
>(STR_PROVIDER_TYPE_NAME));
>- ProvStrLen = StrSize (ProvNameStr);
>- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType =
>EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);
>- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);
>- FreePool (ProvNameStr);
>-
>- mPwdInfoHandle->Info[3] = Info;
>- mPwdInfoHandle->Count++;
>- }
>-
>- if (*UserInfo == NULL) {
>- //
>- // Return the first info handle.
>- //
>- *UserInfo = (EFI_USER_INFO_HANDLE) mPwdInfoHandle->Info[0];
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Find information handle in credential info table.
>- //
>- for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {
>- Info = mPwdInfoHandle->Info[Index];
>- if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {
>- //
>- // The handle is found, get the next one.
>- //
>- if (Index == mPwdInfoHandle->Count - 1) {
>- //
>- // Already last one.
>- //
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>- }
>-
>- Index++;
>- *UserInfo = (EFI_USER_INFO_HANDLE)mPwdInfoHandle->Info[Index];
>- return EFI_SUCCESS;
>- }
>- }
>-
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- Delete a user on this credential provider.
>-
>- This function deletes a user on this credential provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle to delete.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>deletion on the user profile handle.
>- Either the user profile cannot delete on any user profile or
>cannot delete
>- on a user profile other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>deletion in the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be deleted
>because of a device error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDelete (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINT8 *UserId;
>- UINT8 *NewUserId;
>- UINTN Index;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Get User Identifier.
>- //
>- UserInfo = NULL;
>- Status = FindUserInfoByType (
>- User,
>- EFI_USER_INFO_IDENTIFIER_RECORD,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Find the user by user identifier in mPwdTable.
>- //
>- for (Index = 0; Index < mPwdTable->Count; Index++) {
>- UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;
>- NewUserId = (UINT8 *) (UserInfo + 1);
>- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER))
>== 0) {
>- //
>- // Found the user, delete it.
>- //
>- ModifyTable (Index, NULL);
>- break;
>- }
>- }
>-
>- FreePool (UserInfo);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Main entry for this driver.
>-
>- @param ImageHandle Image handle this driver.
>- @param SystemTable Pointer to SystemTable.
>-
>- @retval EFI_SUCESS This function always complete successfully.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-PasswordProviderInit (
>- IN EFI_HANDLE ImageHandle,
>- IN EFI_SYSTEM_TABLE *SystemTable
>- )
>-{
>- EFI_STATUS Status;
>-
>- //
>- // It is NOT robust enough to be included in production.
>- //
>- #error "This implementation is just a sample, please comment this line if you
>really want to use this driver."
>-
>- //
>- // Init credential table.
>- //
>- Status = InitCredentialTable ();
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Init Form Browser.
>- //
>- Status = InitFormBrowser ();
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Install protocol interfaces for the password credential provider.
>- //
>- Status = gBS->InstallProtocolInterface (
>- &mCallbackInfo->DriverHandle,
>- &gEfiUserCredential2ProtocolGuid,
>- EFI_NATIVE_INTERFACE,
>- &gPwdCredentialProviderDriver
>- );
>- return Status;
>-}
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.h
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>Provider.h
>deleted file mode 100644
>index fd782549fd..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.h
>+++ /dev/null
>@@ -1,374 +0,0 @@
>-/** @file
>- Password Credential Provider driver header file.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef _PASSWORD_CREDENTIAL_PROVIDER_H_
>-#define _PASSWORD_CREDENTIAL_PROVIDER_H_
>-
>-#include <Uefi.h>
>-
>-#include <Guid/GlobalVariable.h>
>-
>-#include <Protocol/HiiConfigAccess.h>
>-#include <Protocol/UserCredential2.h>
>-#include <Protocol/UserManager.h>
>-
>-#include <Library/UefiRuntimeServicesTableLib.h>
>-#include <Library/UefiBootServicesTableLib.h>
>-#include <Library/MemoryAllocationLib.h>
>-#include <Library/BaseMemoryLib.h>
>-#include <Library/DevicePathLib.h>
>-#include <Library/DebugLib.h>
>-#include <Library/UefiLib.h>
>-#include <Library/PrintLib.h>
>-#include <Library/HiiLib.h>
>-#include <Library/BaseCryptLib.h>
>-
>-#include "PwdCredentialProviderData.h"
>-
>-extern UINT8 PwdCredentialProviderStrings[];
>-extern UINT8 PwdCredentialProviderVfrBin[];
>-
>-#define PASSWORD_TABLE_INC 16
>-#define CREDENTIAL_LEN 20
>-
>-//
>-// Password credential information.
>-//
>-typedef struct {
>- EFI_USER_INFO_IDENTIFIER UserId;
>- CHAR8 Password[CREDENTIAL_LEN];
>-} PASSWORD_INFO;
>-
>-//
>-// Password credential table.
>-//
>-typedef struct {
>- UINTN Count;
>- UINTN MaxCount;
>- UINTN ValidIndex;
>- PASSWORD_INFO UserInfo[1];
>-} CREDENTIAL_TABLE;
>-
>-//
>-// The user information on the password provider.
>-//
>-typedef struct {
>- UINTN Count;
>- EFI_USER_INFO *Info[1];
>-} PASSWORD_CREDENTIAL_INFO;
>-
>-///
>-/// HII specific Vendor Device Path definition.
>-///
>-typedef struct {
>- VENDOR_DEVICE_PATH VendorDevicePath;
>- EFI_DEVICE_PATH_PROTOCOL End;
>-} HII_VENDOR_DEVICE_PATH;
>-
>-#define PWD_PROVIDER_SIGNATURE SIGNATURE_32 ('P', 'W', 'D', 'P')
>-
>-typedef struct {
>- UINTN Signature;
>- EFI_HANDLE DriverHandle;
>- EFI_HII_HANDLE HiiHandle;
>- //
>- // Produced protocol.
>- //
>- EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
>-} PWD_PROVIDER_CALLBACK_INFO;
>-
>-
>-/**
>- Enroll a user on a credential provider.
>-
>- This function enrolls a user on this credential provider. If the user exists on
>- this credential provider, update the user information on this credential
>provider;
>- otherwise delete the user information on credential provider.
>-
>- @param[in] This Points to this instance of
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile to enroll.
>-
>- @retval EFI_SUCCESS User profile was successfully enrolled.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>enrollment on the
>- user profile handle. Either the user profile cannot enroll
>- on any user profile or cannot enroll on a user profile
>- other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>enrollment in
>- the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be created
>because of a device
>- error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialEnroll (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-/**
>- Returns the user interface information used during user identification.
>-
>- This function returns information about the form used when interacting
>with the
>- user during user identification. The form is the first enabled form in the
>form-set
>- class EFI_HII_USER_CREDENTIAL_FORMSET_GUID installed on the HII
>handle HiiHandle. If
>- the user credential provider does not require a form to identify the user,
>then this
>- function should return EFI_NOT_FOUND.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] FormSetId On return, holds the identifier of the form set
>which contains
>- the form used during user identification.
>- @param[out] FormId On return, holds the identifier of the form used
>during user
>- identification.
>-
>- @retval EFI_SUCCESS Form returned successfully.
>- @retval EFI_NOT_FOUND Form not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or FormSetId is NULL or
>FormId is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialForm (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_GUID *FormSetId,
>- OUT EFI_FORM_ID *FormId
>- );
>-
>-/**
>- Returns bitmap used to describe the credential provider type.
>-
>- This optional function returns a bitmap which is less than or equal to the
>number
>- of pixels specified by Width and Height. If no such bitmap exists, then
>EFI_NOT_FOUND
>- is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] Width On entry, points to the desired bitmap width. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- width of the bitmap returned.
>- @param[in, out] Height On entry, points to the desired bitmap height. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- height of the bitmap returned
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] Image On return, holds the HII image identifier.
>-
>- @retval EFI_SUCCESS Image identifier returned successfully.
>- @retval EFI_NOT_FOUND Image identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or Image is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTile (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT UINTN *Width,
>- IN OUT UINTN *Height,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_IMAGE_ID *Image
>- );
>-
>-/**
>- Returns string used to describe the credential provider type.
>-
>- This function returns a string which describes the credential provider. If no
>- such string exists, then EFI_NOT_FOUND is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] String On return, holds the HII string identifier.
>-
>- @retval EFI_SUCCESS String identifier returned successfully.
>- @retval EFI_NOT_FOUND String identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or String is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTitle (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_STRING_ID *String
>- );
>-
>-/**
>- Return the user identifier associated with the currently authenticated user.
>-
>- This function returns the user identifier of the user authenticated by this
>credential
>- provider. This function is called after the credential-related information has
>been
>- submitted on a form OR after a call to Default() has returned that this
>credential is
>- ready to log on.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle of the user profile currently
>being
>- considered by the user identity manager. If NULL, then no user
>- profile is currently under consideration.
>- @param[out] Identifier On return, points to the user identifier.
>-
>- @retval EFI_SUCCESS User identifier returned successfully.
>- @retval EFI_NOT_READY No user identifier can be returned.
>- @retval EFI_ACCESS_DENIED The user has been locked out of this user
>credential.
>- @retval EFI_INVALID_PARAMETER This is NULL, or Identifier is NULL.
>- @retval EFI_NOT_FOUND User is not NULL, and the specified user
>handle can't be
>- found in user profile database
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialUser (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- OUT EFI_USER_INFO_IDENTIFIER *Identifier
>- );
>-
>-/**
>- Indicate that user interface interaction has begun for the specified
>credential.
>-
>- This function is called when a credential provider is selected by the user. If
>- AutoLogon returns FALSE, then the user interface will be constructed by the
>User
>- Identity Manager.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, points to the credential provider's
>capabilities
>- after the credential provider has been selected by the user.
>-
>- @retval EFI_SUCCESS Credential provider successfully selected.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialSelect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- );
>-
>-/**
>- Indicate that user interface interaction has ended for the specified
>credential.
>-
>- This function is called when a credential provider is deselected by the user.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>-
>- @retval EFI_SUCCESS Credential provider successfully deselected.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDeselect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This
>- );
>-
>-/**
>- Return the default logon behavior for this user credential.
>-
>- This function reports the default login behavior regarding this credential
>provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, holds whether the credential provider
>should be used
>- by default to automatically log on the user.
>-
>- @retval EFI_SUCCESS Default information successfully returned.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDefault (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- );
>-
>-/**
>- Return information attached to the credential provider.
>-
>- This function returns user information.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] UserInfo Handle of the user information data record.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes. On
>- exit, holds the user information. If the buffer is too small
>- to hold the information, then EFI_BUFFER_TOO_SMALL is
>returned
>- and InfoSize is updated to contain the number of bytes
>actually
>- required.
>- @param[in, out] InfoSize On entry, points to the size of Info. On return,
>points to the
>- size of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_BUFFER_TOO_SMALL The size specified by InfoSize is too small
>to hold all of the
>- user information. The size required is returned in *InfoSize.
>- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
>- @retval EFI_NOT_FOUND The specified UserInfo does not refer to a
>valid user info handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- );
>-
>-
>-/**
>- Enumerate all of the user informations on the credential provider.
>-
>- This function returns the next user information record. To retrieve the first
>user
>- information record handle, point UserInfo at a NULL. Each subsequent call
>will retrieve
>- another user information record handle until there are no more, at which
>point UserInfo
>- will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] UserInfo On entry, points to the previous user information
>handle or NULL
>- to start enumeration. On exit, points to the next user
>information
>- handle or NULL if there is no more user information.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetNextInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- );
>-
>-/**
>- Delete a user on this credential provider.
>-
>- This function deletes a user on this credential provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle to delete.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>deletion on the user profile handle.
>- Either the user profile cannot delete on any user profile or
>cannot delete
>- on a user profile other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>deletion in the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be deleted
>because of a device error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDelete (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.uni
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>Provider.uni
>deleted file mode 100644
>index 749e9a8f17..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>rovider.uni
>+++ /dev/null
>@@ -1,21 +0,0 @@
>-// /** @file
>-// Provides a password credential provider implementation
>-//
>-// This module provides a password credential provider implementation.
>-//
>-// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-
>-#string STR_MODULE_ABSTRACT #language en-US "Provides a
>password credential provider implementation"
>-
>-#string STR_MODULE_DESCRIPTION #language en-US "This module
>provides a password credential provider implementation."
>-
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderData.h
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>ProviderData.h
>deleted file mode 100644
>index 31bdfe4c50..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderData.h
>+++ /dev/null
>@@ -1,30 +0,0 @@
>-/** @file
>- Data structure used by the Password Credential Provider driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef _PWD_CREDENTIAL_PROVIDER_DATA_H_
>-#define _PWD_CREDENTIAL_PROVIDER_DATA_H_
>-
>-#include <Guid/PwdCredentialProviderHii.h>
>-
>-//
>-// Forms definition
>-//
>-#define FORMID_GET_PASSWORD_FORM 1
>-
>-//
>-// Key defination
>-//
>-#define KEY_GET_PASSWORD 0x1000
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderDxe.inf
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>ProviderDxe.inf
>deleted file mode 100644
>index ab7ba2c913..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderDxe.inf
>+++ /dev/null
>@@ -1,65 +0,0 @@
>-## @file
>-# Provides a password credential provider implementation
>-# This module provides a password credential provider implementation.
>-#
>-# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-# This program and the accompanying materials
>-# are licensed and made available under the terms and conditions of the BSD
>License
>-# which accompanies this distribution. The full text of the license may be
>found at
>-# http://opensource.org/licenses/bsd-license.php
>-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-#
>-##
>-
>-[Defines]
>- INF_VERSION = 0x00010005
>- BASE_NAME = PwdCredentialProvider
>- MODULE_UNI_FILE = PwdCredentialProvider.uni
>- FILE_GUID = D6C589EA-DD29-49ef-97F6-1A9FE19A04E0
>- MODULE_TYPE = UEFI_DRIVER
>- VERSION_STRING = 1.0
>- ENTRY_POINT = PasswordProviderInit
>-
>-[Sources]
>- PwdCredentialProvider.c
>- PwdCredentialProvider.h
>- PwdCredentialProviderData.h
>- PwdCredentialProviderVfr.Vfr
>- PwdCredentialProviderStrings.uni
>-
>-[Packages]
>- MdePkg/MdePkg.dec
>- MdeModulePkg/MdeModulePkg.dec
>- CryptoPkg/CryptoPkg.dec
>- SecurityPkg/SecurityPkg.dec
>-
>-[LibraryClasses]
>- UefiRuntimeServicesTableLib
>- UefiBootServicesTableLib
>- UefiDriverEntryPoint
>- MemoryAllocationLib
>- BaseMemoryLib
>- DebugLib
>- HiiLib
>- UefiLib
>- BaseCryptLib
>-
>-[Guids]
>- gEfiUserCredentialClassPasswordGuid ## SOMETIMES_CONSUMES
>## GUID
>-
>- ## PRODUCES ## Variable:L"PwdCredential"
>- ## CONSUMES ## Variable:L"PwdCredential"
>- ## CONSUMES ## HII
>- ## SOMETIMES_CONSUMES ## GUID # The credential provider
>identifier
>- gPwdCredentialProviderGuid
>-
>-[Protocols]
>- gEfiDevicePathProtocolGuid ## PRODUCES
>- gEfiHiiConfigAccessProtocolGuid ## PRODUCES
>- gEfiUserCredential2ProtocolGuid ## PRODUCES
>- gEfiUserManagerProtocolGuid ## SOMETIMES_CONSUMES
>-
>-[UserExtensions.TianoCore."ExtraFiles"]
>- PwdCredentialProviderExtra.uni
>-
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderExtra.uni
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>ProviderExtra.uni
>deleted file mode 100644
>index bcc220a51d..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderExtra.uni
>+++ /dev/null
>@@ -1,19 +0,0 @@
>-// /** @file
>-// PwdCredentialProvider Localized Strings and Content
>-//
>-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-#string STR_PROPERTIES_MODULE_NAME
>-#language en-US
>-"Password Credential Provider"
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderStrings.uni
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>ProviderStrings.uni
>deleted file mode 100644
>index e7b3126f83..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderStrings.uni
>+++ /dev/null
>@@ -1,38 +0,0 @@
>-/** @file
>- String definitions for the Password Credential Provider.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php.
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#langdef en-US "English"
>-#langdef fr-FR "Francais"
>-
>-#string STR_CREDENTIAL_TITLE #language en-US "Password
>Credential Provider"
>- #language fr-FR "Password Credential Provider
>(French)"
>-#string STR_FORM_TITLE #language en-US "Get Password"
>- #language fr-FR "Get Password(French)"
>-#string STR_NULL_STRING #language en-US ""
>- #language fr-FR ""
>-#string STR_INPUT_PASSWORD #language en-US "Please Input
>Password"
>- #language fr-FR "Please Input Password(French)"
>-#string STR_PROVIDER_NAME #language en-US "INTEL
>Password Credential Provider"
>- #language fr-FR "INTEL Password Credential
>Provider(French)"
>-#string STR_PROVIDER_TYPE_NAME #language en-US "Password
>Credential Provider"
>- #language fr-FR "Password Credential
>Provider(French)"
>-#string STR_INPUT_PASSWORD_AGAIN #language en-US "Input
>Password Again"
>- #language fr-FR "Input Password Again (French)"
>-#string STR_DRAW_A_LINE #language en-US "---------------------
>--------"
>- #language fr-FR "------------------------------------"
>-#string STR_PASSWORD_INCORRECT #language en-US " Incorrect
>Password! "
>- #language fr-FR " Incorrect Password! (French) "
>-#string STR_PASSWORD_MISMATCH #language en-US " The
>Password Mismatch! "
>- #language fr-FR " The Password Mismatch! (French)
>"
>-
>diff --git
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderVfr.Vfr
>b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredential
>ProviderVfr.Vfr
>deleted file mode 100644
>index 60972203b0..0000000000
>---
>a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialP
>roviderVfr.Vfr
>+++ /dev/null
>@@ -1,34 +0,0 @@
>-/** @file
>- Password Credential Provider formset.
>-
>-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "PwdCredentialProviderData.h"
>-
>-formset
>- guid = PWD_CREDENTIAL_PROVIDER_GUID,
>- title = STRING_TOKEN(STR_CREDENTIAL_TITLE),
>- help = STRING_TOKEN(STR_NULL_STRING),
>- classguid = PWD_CREDENTIAL_PROVIDER_GUID,
>-
>- form formid = FORMID_GET_PASSWORD_FORM,
>- title = STRING_TOKEN(STR_FORM_TITLE);
>-
>- text
>- help = STRING_TOKEN(STR_NULL_STRING),
>- text = STRING_TOKEN(STR_INPUT_PASSWORD),
>- flags = INTERACTIVE,
>- key = KEY_GET_PASSWORD;
>-
>- endform;
>-
>-endformset;
>\ No newline at end of file
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.c
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.c
>deleted file mode 100644
>index 841e975103..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.c
>+++ /dev/null
>@@ -1,1410 +0,0 @@
>-/** @file
>- Usb Credential Provider driver implemenetation.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UsbCredentialProvider.h"
>-
>-CREDENTIAL_TABLE *mUsbTable = NULL;
>-USB_PROVIDER_CALLBACK_INFO *mCallbackInfo = NULL;
>-USB_CREDENTIAL_INFO *mUsbInfoHandle = NULL;
>-
>-EFI_USER_CREDENTIAL2_PROTOCOL gUsbCredentialProviderDriver = {
>- USB_CREDENTIAL_PROVIDER_GUID,
>- EFI_USER_CREDENTIAL_CLASS_SECURE_CARD,
>- CredentialEnroll,
>- CredentialForm,
>- CredentialTile,
>- CredentialTitle,
>- CredentialUser,
>- CredentialSelect,
>- CredentialDeselect,
>- CredentialDefault,
>- CredentialGetInfo,
>- CredentialGetNextInfo,
>- EFI_CREDENTIAL_CAPABILITIES_ENROLL,
>- CredentialDelete
>-};
>-
>-
>-/**
>- Get string by string id from HII Interface.
>-
>-
>- @param[in] Id String ID to get the string from.
>-
>- @retval CHAR16 * String from ID.
>- @retval NULL If error occurs.
>-
>-**/
>-CHAR16 *
>-GetStringById (
>- IN EFI_STRING_ID Id
>- )
>-{
>- //
>- // Get the current string for the current Language
>- //
>- return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL);
>-}
>-
>-
>-/**
>- Expand password table size.
>-
>-**/
>-VOID
>-ExpandTableSize (
>- VOID
>- )
>-{
>- CREDENTIAL_TABLE *NewTable;
>- UINTN Count;
>-
>- Count = mUsbTable->MaxCount + USB_TABLE_INC;
>- //
>- // Create new credential table.
>- //
>- NewTable = AllocateZeroPool (
>- sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +
>- Count * sizeof (USB_INFO)
>- );
>- ASSERT (NewTable != NULL);
>-
>- NewTable->MaxCount = Count;
>- NewTable->Count = mUsbTable->Count;
>-
>- //
>- // Copy old entries.
>- //
>- CopyMem (
>- &NewTable->UserInfo,
>- &mUsbTable->UserInfo,
>- mUsbTable->Count * sizeof (USB_INFO)
>- );
>- FreePool (mUsbTable);
>- mUsbTable = NewTable;
>-}
>-
>-
>-/**
>- Add, update or delete info in table, and sync with NV variable.
>-
>- @param[in] Index The index of the password in table. If index is found in
>- table, update the info, else add the into to table.
>- @param[in] Info The new credential info to add into table. If Info is NULL,
>- delete the info by Index.
>-
>- @retval EFI_INVALID_PARAMETER Info is NULL when save the info.
>- @retval EFI_SUCCESS Modify the table successfully.
>- @retval Others Failed to modify the table.
>-
>-**/
>-EFI_STATUS
>-ModifyTable (
>- IN UINTN Index,
>- IN USB_INFO * Info OPTIONAL
>- )
>-{
>- EFI_STATUS Status;
>- USB_INFO *NewUsbInfo;
>-
>- NewUsbInfo = NULL;
>- if (Index < mUsbTable->Count) {
>- if (Info == NULL) {
>- //
>- // Delete the specified entry.
>- //
>- mUsbTable->Count--;
>- if (Index != mUsbTable->Count) {
>- NewUsbInfo = &mUsbTable->UserInfo[mUsbTable->Count];
>- }
>- } else {
>- //
>- // Update the specified entry.
>- //
>- NewUsbInfo = Info;
>- }
>- } else {
>- //
>- // Add a new entry
>- //
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mUsbTable->Count >= mUsbTable->MaxCount) {
>- ExpandTableSize ();
>- }
>-
>- NewUsbInfo = Info;
>- mUsbTable->Count++;
>- }
>-
>- if (NewUsbInfo != NULL) {
>- CopyMem (&mUsbTable->UserInfo[Index], NewUsbInfo, sizeof
>(USB_INFO));
>- }
>-
>- //
>- // Save the credential table.
>- //
>- Status = gRT->SetVariable (
>- L"UsbCredential",
>- &gUsbCredentialProviderGuid,
>- EFI_VARIABLE_NON_VOLATILE |
>EFI_VARIABLE_BOOTSERVICE_ACCESS,
>- mUsbTable->Count * sizeof (USB_INFO),
>- &mUsbTable->UserInfo
>- );
>- return Status;
>-}
>-
>-
>-/**
>- Create a credential table
>-
>- @retval EFI_SUCCESS Create a credential table successfully.
>- @retval Others Failed to create a password.
>-
>-**/
>-EFI_STATUS
>-InitCredentialTable (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 *Var;
>- UINTN VarSize;
>-
>- //
>- // Get Usb credential data from NV variable.
>- //
>- VarSize = 0;
>- Var = NULL;
>- Status = gRT->GetVariable (
>- L"UsbCredential",
>- &gUsbCredentialProviderGuid,
>- NULL,
>- &VarSize,
>- Var
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- Var = AllocateZeroPool (VarSize);
>- if (Var == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = gRT->GetVariable (
>- L"UsbCredential",
>- &gUsbCredentialProviderGuid,
>- NULL,
>- &VarSize,
>- Var
>- );
>- }
>- if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
>- return Status;
>- }
>-
>- //
>- // Init Usb credential table.
>- //
>- mUsbTable = AllocateZeroPool (
>- sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +
>- USB_TABLE_INC * sizeof (USB_INFO) +
>- VarSize
>- );
>- if (mUsbTable == NULL) {
>- FreePool (Var);
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- mUsbTable->Count = VarSize / sizeof (USB_INFO);
>- mUsbTable->MaxCount = mUsbTable->Count + USB_TABLE_INC;
>- if (Var != NULL) {
>- CopyMem (mUsbTable->UserInfo, Var, VarSize);
>- FreePool (Var);
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Read the specified file by FileName in the Usb key and return the file size in
>BufferSize
>- and file content in Buffer.
>- Note: the caller is responsible to free the buffer memory.
>-
>- @param FileName File to read.
>- @param Buffer Returned with data read from the file.
>- @param BufferSize Size of the data buffer.
>-
>- @retval EFI_SUCCESS The command completed successfully.
>- @retval EFI_OUT_OF_RESOURCES Resource allocation failed.
>- @retval EFI_NOT_FOUND File not found.
>- @retval EFI_DEVICE_ERROR Device I/O error.
>-
>-**/
>-EFI_STATUS
>-GetFileData (
>- IN CHAR16 *FileName,
>- OUT VOID **Buffer,
>- OUT UINTN *BufferSize
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- UINTN HandleCount;
>- UINTN ScratchBufferSize;
>- EFI_HANDLE *HandleBuffer;
>- EFI_FILE *RootFs;
>- EFI_FILE *FileHandle;
>- EFI_FILE_INFO *FileInfo;
>- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
>- EFI_BLOCK_IO_PROTOCOL *BlkIo;
>-
>- FileInfo = NULL;
>- FileHandle = NULL;
>-
>- Status = gBS->LocateHandleBuffer (
>- ByProtocol,
>- &gEfiSimpleFileSystemProtocolGuid,
>- NULL,
>- &HandleCount,
>- &HandleBuffer
>- );
>- if (EFI_ERROR (Status)) {
>- DEBUG ((DEBUG_ERROR, "Can not Locate SimpleFileSystemProtocol\n"));
>- goto Done;
>- }
>-
>- //
>- // Find and open the file in removable media disk.
>- //
>- for (Index = 0; Index < HandleCount; Index++) {
>- Status = gBS->HandleProtocol (
>- HandleBuffer[Index],
>- &gEfiBlockIoProtocolGuid,
>- (VOID **) &BlkIo
>- );
>- if (EFI_ERROR (Status)) {
>- continue;
>- }
>-
>- if (BlkIo->Media->RemovableMedia) {
>- Status = gBS->HandleProtocol (
>- HandleBuffer[Index],
>- &gEfiSimpleFileSystemProtocolGuid,
>- (VOID **) &SimpleFileSystem
>- );
>- if (EFI_ERROR (Status)) {
>- continue;
>- }
>-
>- Status = SimpleFileSystem->OpenVolume (
>- SimpleFileSystem,
>- &RootFs
>- );
>- if (EFI_ERROR (Status)) {
>- continue;
>- }
>-
>- Status = RootFs->Open (
>- RootFs,
>- &FileHandle,
>- FileName,
>- EFI_FILE_MODE_READ,
>- 0
>- );
>- if (!EFI_ERROR (Status)) {
>- break;
>- }
>- }
>- }
>-
>- FreePool (HandleBuffer);
>-
>- if (Index >= HandleCount) {
>- DEBUG ((DEBUG_ERROR, "Can not found the token file!\n"));
>- Status = EFI_NOT_FOUND;
>- goto Done;
>- }
>-
>- //
>- // Figure out how big the file is.
>- //
>- ScratchBufferSize = 0;
>- Status = FileHandle->GetInfo (
>- FileHandle,
>- &gEfiFileInfoGuid,
>- &ScratchBufferSize,
>- NULL
>- );
>- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
>- DEBUG ((DEBUG_ERROR, "Can not obtain file size info!\n"));
>- Status = EFI_DEVICE_ERROR;
>- goto Done;
>- }
>-
>- FileInfo = AllocateZeroPool (ScratchBufferSize);
>- if (FileInfo == NULL) {
>- DEBUG ((DEBUG_ERROR, "Can not allocate enough memory for the token
>file!\n"));
>- Status = EFI_OUT_OF_RESOURCES;
>- goto Done;
>- }
>-
>- Status = FileHandle->GetInfo (
>- FileHandle,
>- &gEfiFileInfoGuid,
>- &ScratchBufferSize,
>- FileInfo
>- );
>- if (EFI_ERROR (Status)) {
>- DEBUG ((DEBUG_ERROR, "Can not obtain file info from the token file!\n"));
>- Status = EFI_DEVICE_ERROR;
>- goto Done;
>- }
>-
>- //
>- // Allocate a buffer for the file.
>- //
>- *BufferSize = (UINT32) FileInfo->FileSize;
>- *Buffer = AllocateZeroPool (*BufferSize);
>- if (*Buffer == NULL) {
>- DEBUG ((DEBUG_ERROR, "Can not allocate a buffer for the file!\n"));
>- Status = EFI_OUT_OF_RESOURCES;
>- goto Done;
>- }
>-
>- //
>- // Load file into the allocated memory.
>- //
>- Status = FileHandle->Read (FileHandle, BufferSize, *Buffer);
>- if (EFI_ERROR (Status)) {
>- FreePool (*Buffer);
>- DEBUG ((DEBUG_ERROR, "Can not read the token file!\n"));
>- Status = EFI_DEVICE_ERROR;
>- goto Done;
>- }
>-
>- //
>- // Close file.
>- //
>- Status = FileHandle->Close (FileHandle);
>- if (EFI_ERROR (Status)) {
>- FreePool (*Buffer);
>- DEBUG ((DEBUG_ERROR, "Can not close the token file !\n"));
>- Status = EFI_DEVICE_ERROR;
>- }
>-
>-Done:
>-
>- if (FileInfo != NULL) {
>- FreePool (FileInfo);
>- }
>-
>- return Status;
>-}
>-
>-
>-/**
>- Hash the data to get credential.
>-
>- @param[in] Buffer Points to the data buffer
>- @param[in] BufferSize The size of data in buffer, in bytes.
>- @param[out] Credential Points to the hashed result
>-
>- @retval TRUE Hash the data successfully.
>- @retval FALSE Failed to hash the data.
>-
>-**/
>-BOOLEAN
>-GenerateCredential (
>- IN UINT8 *Buffer,
>- IN UINTN BufferSize,
>- OUT UINT8 *Credential
>- )
>-{
>- BOOLEAN Status;
>- UINTN HashSize;
>- VOID *Hash;
>-
>- HashSize = Sha1GetContextSize ();
>- Hash = AllocatePool (HashSize);
>- ASSERT (Hash != NULL);
>-
>- Status = Sha1Init (Hash);
>- if (!Status) {
>- goto Done;
>- }
>-
>- Status = Sha1Update (Hash, Buffer, BufferSize);
>- if (!Status) {
>- goto Done;
>- }
>-
>- Status = Sha1Final (Hash, Credential);
>-
>-Done:
>- FreePool (Hash);
>- return Status;
>-}
>-
>-
>-/**
>- Read the token file, and default the Token is saved at the begining of the file.
>-
>- @param[out] Token Token read from a Token file.
>-
>- @retval EFI_SUCCESS Read a Token successfully.
>- @retval Others Fails to read a Token.
>-
>-**/
>-EFI_STATUS
>-GetToken (
>- OUT UINT8 *Token
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 *Buffer;
>- UINTN BufSize;
>- CHAR16 *TokenFile;
>-
>- BufSize = 0;
>- Buffer = NULL;
>- TokenFile = PcdGetPtr (PcdFixedUsbCredentialProviderTokenFileName);
>- Status = GetFileData (TokenFile, (VOID *)&Buffer, &BufSize);
>- if (EFI_ERROR (Status)) {
>- DEBUG ((DEBUG_ERROR, "Read file %s from USB error! Status=(%r)\n",
>TokenFile, Status));
>- return Status;
>- }
>-
>- if (!GenerateCredential (Buffer, BufSize, Token)) {
>- DEBUG ((DEBUG_ERROR, "Generate credential from read data failed!\n"));
>- FreePool (Buffer);
>- return EFI_SECURITY_VIOLATION;
>- }
>-
>- FreePool (Buffer);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Find a user infomation record by the information record type.
>-
>- This function searches all user information records of User from beginning
>- until either the information is found or there are no more user infomation
>- record. A match occurs when a Info.InfoType field matches the user
>information
>- record type.
>-
>- @param[in] User Points to the user profile record to search.
>- @param[in] InfoType The infomation type to be searched.
>- @param[out] Info Points to the user info found, the caller is responsible
>- to free.
>-
>- @retval EFI_SUCCESS Find the user information successfully.
>- @retval Others Fail to find the user information.
>-
>-**/
>-EFI_STATUS
>-FindUserInfoByType (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT8 InfoType,
>- OUT EFI_USER_INFO **Info
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINTN UserInfoSize;
>- EFI_USER_INFO_HANDLE UserInfoHandle;
>- EFI_USER_MANAGER_PROTOCOL *UserManager;
>-
>- //
>- // Find user information by information type.
>- //
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- Status = gBS->LocateProtocol (
>- &gEfiUserManagerProtocolGuid,
>- NULL,
>- (VOID **) &UserManager
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Get each user information.
>- //
>-
>- UserInfoHandle = NULL;
>- UserInfo = NULL;
>- UserInfoSize = 0;
>- while (TRUE) {
>- Status = UserManager->GetNextInfo (UserManager, User,
>&UserInfoHandle);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- //
>- // Get information.
>- //
>- Status = UserManager->GetInfo (
>- UserManager,
>- User,
>- UserInfoHandle,
>- UserInfo,
>- &UserInfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- if (UserInfo != NULL) {
>- FreePool (UserInfo);
>- }
>- UserInfo = AllocateZeroPool (UserInfoSize);
>- if (UserInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = UserManager->GetInfo (
>- UserManager,
>- User,
>- UserInfoHandle,
>- UserInfo,
>- &UserInfoSize
>- );
>- }
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- ASSERT (UserInfo != NULL);
>- if (UserInfo->InfoType == InfoType) {
>- *Info = UserInfo;
>- return EFI_SUCCESS;
>- }
>- }
>-
>- if (UserInfo != NULL) {
>- FreePool (UserInfo);
>- }
>- return Status;
>-}
>-
>-
>-/**
>- This function initialize the data mainly used in form browser.
>-
>- @retval EFI_SUCCESS Initialize form data successfully.
>- @retval Others Fail to Initialize form data.
>-
>-**/
>-EFI_STATUS
>-InitFormBrowser (
>- VOID
>- )
>-{
>- USB_PROVIDER_CALLBACK_INFO *CallbackInfo;
>-
>- //
>- // Initialize driver private data.
>- //
>- CallbackInfo = AllocateZeroPool (sizeof (USB_PROVIDER_CALLBACK_INFO));
>- if (CallbackInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- CallbackInfo->DriverHandle = NULL;
>-
>- //
>- // Publish HII data.
>- //
>- CallbackInfo->HiiHandle = HiiAddPackages (
>- &gUsbCredentialProviderGuid,
>- CallbackInfo->DriverHandle,
>- UsbCredentialProviderStrings,
>- NULL
>- );
>- if (CallbackInfo->HiiHandle == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- mCallbackInfo = CallbackInfo;
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Enroll a user on a credential provider.
>-
>- This function enrolls a user on this credential provider. If the user exists on
>- this credential provider, update the user information on this credential
>provider;
>- otherwise add the user information on credential provider.
>-
>- @param[in] This Points to this instance of
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile to enroll.
>-
>- @retval EFI_SUCCESS User profile was successfully enrolled.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>enrollment on the
>- user profile handle. Either the user profile cannot enroll
>- on any user profile or cannot enroll on a user profile
>- other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>enrollment in
>- the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be created
>because of a device
>- error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialEnroll (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- USB_INFO UsbInfo;
>- EFI_USER_INFO *UserInfo;
>- EFI_INPUT_KEY Key;
>- UINT8 *UserId;
>- CHAR16 *QuestionStr;
>- CHAR16 *PromptStr;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Get User Identifier
>- //
>- UserInfo = NULL;
>- Status = FindUserInfoByType (
>- User,
>- EFI_USER_INFO_IDENTIFIER_RECORD,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- CopyMem (UsbInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof
>(EFI_USER_INFO_IDENTIFIER));
>- FreePool (UserInfo);
>-
>- //
>- // Get Token and User ID to UsbInfo.
>- //
>- Status = GetToken (UsbInfo.Token);
>- if (EFI_ERROR (Status)) {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_READ_USB_TOKEN_ERROR));
>- PromptStr = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>- return Status;
>- }
>-
>- //
>- // Check whether User is ever enrolled in the provider.
>- //
>- for (Index = 0; Index < mUsbTable->Count; Index++) {
>- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;
>- if (CompareMem (UserId, (UINT8 *) &UsbInfo.UserId, sizeof
>(EFI_USER_INFO_IDENTIFIER)) == 0) {
>- //
>- // User already exists, update the password.
>- //
>- break;
>- }
>- }
>-
>- //
>- // Enroll the User to the provider.
>- //
>- Status = ModifyTable (Index, &UsbInfo);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Returns the user interface information used during user identification.
>-
>- This function returns information about the form used when interacting
>with the
>- user during user identification. The form is the first enabled form in the
>form-set
>- class EFI_HII_USER_CREDENTIAL_FORMSET_GUID installed on the HII
>handle HiiHandle. If
>- the user credential provider does not require a form to identify the user,
>then this
>- function should return EFI_NOT_FOUND.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] FormSetId On return, holds the identifier of the form set
>which contains
>- the form used during user identification.
>- @param[out] FormId On return, holds the identifier of the form used
>during user
>- identification.
>-
>- @retval EFI_SUCCESS Form returned successfully.
>- @retval EFI_NOT_FOUND Form not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or FormSetId is NULL or
>FormId is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialForm (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_GUID *FormSetId,
>- OUT EFI_FORM_ID *FormId
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) ||
>- (FormSetId == NULL) || (FormId == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Returns bitmap used to describe the credential provider type.
>-
>- This optional function returns a bitmap which is less than or equal to the
>number
>- of pixels specified by Width and Height. If no such bitmap exists, then
>EFI_NOT_FOUND
>- is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] Width On entry, points to the desired bitmap width. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- width of the bitmap returned.
>- @param[in, out] Height On entry, points to the desired bitmap height. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- height of the bitmap returned.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] Image On return, holds the HII image identifier.
>-
>- @retval EFI_SUCCESS Image identifier returned successfully.
>- @retval EFI_NOT_FOUND Image identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or Image is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTile (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT UINTN *Width,
>- IN OUT UINTN *Height,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_IMAGE_ID *Image
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) || (Image == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Returns string used to describe the credential provider type.
>-
>- This function returns a string which describes the credential provider. If no
>- such string exists, then EFI_NOT_FOUND is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] String On return, holds the HII string identifier.
>-
>- @retval EFI_SUCCESS String identifier returned successfully.
>- @retval EFI_NOT_FOUND String identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or String is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTitle (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_STRING_ID *String
>- )
>-{
>- if ((This == NULL) || (Hii == NULL) || (String == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- //
>- // Set Hii handle and String ID.
>- //
>- *Hii = mCallbackInfo->HiiHandle;
>- *String = STRING_TOKEN (STR_CREDENTIAL_TITLE);
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return the user identifier associated with the currently authenticated user.
>-
>- This function returns the user identifier of the user authenticated by this
>credential
>- provider. This function is called after the credential-related information has
>been
>- submitted on a form OR after a call to Default() has returned that this
>credential is
>- ready to log on.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle of the user profile currently
>being
>- considered by the user identity manager. If NULL, then no user
>- profile is currently under consideration.
>- @param[out] Identifier On return, points to the user identifier.
>-
>- @retval EFI_SUCCESS User identifier returned successfully.
>- @retval EFI_NOT_READY No user identifier can be returned.
>- @retval EFI_ACCESS_DENIED The user has been locked out of this user
>credential.
>- @retval EFI_INVALID_PARAMETER This is NULL, or Identifier is NULL.
>- @retval EFI_NOT_FOUND User is not NULL, and the specified user
>handle can't be
>- found in user profile database.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialUser (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- OUT EFI_USER_INFO_IDENTIFIER *Identifier
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- EFI_USER_INFO *UserInfo;
>- UINT8 *UserId;
>- UINT8 *NewUserId;
>- UINT8 *UserToken;
>- UINT8 ReadToken[HASHED_CREDENTIAL_LEN];
>- EFI_INPUT_KEY Key;
>- CHAR16 *QuestionStr;
>- CHAR16 *PromptStr;
>-
>- if ((This == NULL) || (Identifier == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (User == NULL) {
>- //
>- // Verify the auto logon user, get user id by matched token.
>- //
>- if (mUsbTable->Count == 0) {
>- return EFI_NOT_READY;
>- }
>-
>- //
>- // No user selected, get token first and verify the user existed in user
>database.
>- //
>- Status = GetToken (ReadToken);
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_READY;
>- }
>-
>- for (Index = 0; Index < mUsbTable->Count; Index++) {
>- //
>- // find the specified credential in the Usb credential database.
>- //
>- UserToken = mUsbTable->UserInfo[Index].Token;
>- if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) ==
>0) {
>- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;
>- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));
>- return EFI_SUCCESS;
>- }
>- }
>-
>- return EFI_NOT_READY;
>- }
>-
>- //
>- // User is not NULL here. Read a token, and check whether the token
>matches with
>- // the selected user's Token. If not, try to find a token in token DB to
>matches
>- // with read token.
>- //
>-
>- Status = GetToken (ReadToken);
>- if (EFI_ERROR (Status)) {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_READ_USB_TOKEN_ERROR));
>- PromptStr = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Get the selected user's identifier.
>- //
>- Status = FindUserInfoByType (User, EFI_USER_INFO_IDENTIFIER_RECORD,
>&UserInfo);
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Check the selected user's Token with the read token.
>- //
>- for (Index = 0; Index < mUsbTable->Count; Index++) {
>- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;
>- NewUserId = (UINT8 *) (UserInfo + 1);
>- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER))
>== 0) {
>- //
>- // The user's ID is found in the UsbTable.
>- //
>- UserToken = mUsbTable->UserInfo[Index].Token;
>- if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) ==
>0) {
>- //
>- // The read token matches with the one in UsbTable.
>- //
>- CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));
>- FreePool (UserInfo);
>- return EFI_SUCCESS;
>- }
>- }
>- }
>-
>- FreePool (UserInfo);
>-
>- return EFI_NOT_READY;
>-}
>-
>-
>-/**
>- Indicate that user interface interaction has begun for the specified
>credential.
>-
>- This function is called when a credential provider is selected by the user. If
>- AutoLogon returns FALSE, then the user interface will be constructed by the
>User
>- Identity Manager.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, points to the credential provider's
>capabilities
>- after the credential provider has been selected by the user.
>-
>- @retval EFI_SUCCESS Credential provider successfully selected.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialSelect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- )
>-{
>- if ((This == NULL) || (AutoLogon == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT |
>EFI_CREDENTIAL_LOGON_FLAG_AUTO;
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Indicate that user interface interaction has ended for the specified
>credential.
>-
>- This function is called when a credential provider is deselected by the user.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>-
>- @retval EFI_SUCCESS Credential provider successfully deselected.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDeselect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This
>- )
>-{
>- if (This == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return the default logon behavior for this user credential.
>-
>- This function reports the default login behavior regarding this credential
>provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, holds whether the credential provider
>should be used
>- by default to automatically log on the user.
>-
>- @retval EFI_SUCCESS Default information successfully returned.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDefault (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- )
>-{
>- if ((This == NULL) || (AutoLogon == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT |
>EFI_CREDENTIAL_LOGON_FLAG_AUTO;
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return information attached to the credential provider.
>-
>- This function returns user information.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] UserInfo Handle of the user information data record.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes. On
>- exit, holds the user information. If the buffer is too small
>- to hold the information, then EFI_BUFFER_TOO_SMALL is
>returned
>- and InfoSize is updated to contain the number of bytes
>actually
>- required.
>- @param[in, out] InfoSize On entry, points to the size of Info. On return,
>points to the
>- size of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_BUFFER_TOO_SMALL The size specified by InfoSize is too small
>to hold all of the
>- user information. The size required is returned in *InfoSize.
>- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
>- @retval EFI_NOT_FOUND The specified UserInfo does not refer to a
>valid user info handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- )
>-{
>- EFI_USER_INFO *CredentialInfo;
>- UINTN Index;
>-
>- if ((This == NULL) || (InfoSize == NULL) || (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if ((UserInfo == NULL) || (mUsbInfoHandle == NULL)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Find information handle in credential info table.
>- //
>- for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {
>- CredentialInfo = mUsbInfoHandle->Info[Index];
>- if (UserInfo == (EFI_USER_INFO_HANDLE)CredentialInfo) {
>- //
>- // The handle is found, copy the user info.
>- //
>- if (CredentialInfo->InfoSize > *InfoSize) {
>- *InfoSize = CredentialInfo->InfoSize;
>- return EFI_BUFFER_TOO_SMALL;
>- }
>-
>- CopyMem (Info, CredentialInfo, CredentialInfo->InfoSize);
>- return EFI_SUCCESS;
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Enumerate all of the user informations on the credential provider.
>-
>- This function returns the next user information record. To retrieve the first
>user
>- information record handle, point UserInfo at a NULL. Each subsequent call
>will retrieve
>- another user information record handle until there are no more, at which
>point UserInfo
>- will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] UserInfo On entry, points to the previous user information
>handle or NULL
>- to start enumeration. On exit, points to the next user
>information
>- handle or NULL if there is no more user information.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetNextInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- )
>-{
>- EFI_USER_INFO *Info;
>- CHAR16 *ProvNameStr;
>- UINTN InfoLen;
>- UINTN Index;
>- UINTN ProvStrLen;
>-
>- if ((This == NULL) || (UserInfo == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mUsbInfoHandle == NULL) {
>- //
>- // Initilized user info table. There are 4 user info records in the table.
>- //
>- InfoLen = sizeof (USB_CREDENTIAL_INFO) + (4 - 1) * sizeof
>(EFI_USER_INFO *);
>- mUsbInfoHandle = AllocateZeroPool (InfoLen);
>- if (mUsbInfoHandle == NULL) {
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // The first information, Credential Provider info.
>- //
>- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType = EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gUsbCredentialProviderGuid);
>- CopyGuid ((EFI_GUID *)(Info + 1), &gUsbCredentialProviderGuid);
>-
>- mUsbInfoHandle->Info[0] = Info;
>- mUsbInfoHandle->Count++;
>-
>- //
>- // The second information, Credential Provider name info.
>- //
>- ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_NAME));
>- ProvStrLen = StrSize (ProvNameStr);
>- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType =
>EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gUsbCredentialProviderGuid);
>- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);
>- FreePool (ProvNameStr);
>-
>- mUsbInfoHandle->Info[1] = Info;
>- mUsbInfoHandle->Count++;
>-
>- //
>- // The third information, Credential Provider type info.
>- //
>- InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType = EFI_USER_INFO_CREDENTIAL_TYPE_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gUsbCredentialProviderGuid);
>- CopyGuid ((EFI_GUID *)(Info + 1),
>&gEfiUserCredentialClassSecureCardGuid);
>-
>- mUsbInfoHandle->Info[2] = Info;
>- mUsbInfoHandle->Count++;
>-
>- //
>- // The fourth information, Credential Provider type name info.
>- //
>- ProvNameStr = GetStringById (STRING_TOKEN
>(STR_PROVIDER_TYPE_NAME));
>- ProvStrLen = StrSize (ProvNameStr);
>- InfoLen = sizeof (EFI_USER_INFO) + ProvStrLen;
>- Info = AllocateZeroPool (InfoLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType =
>EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;
>- Info->InfoSize = (UINT32) InfoLen;
>- Info->InfoAttribs = EFI_USER_INFO_PROTECTED;
>- CopyGuid (&Info->Credential, &gUsbCredentialProviderGuid);
>- CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);
>- FreePool (ProvNameStr);
>-
>- mUsbInfoHandle->Info[3] = Info;
>- mUsbInfoHandle->Count++;
>- }
>-
>- if (*UserInfo == NULL) {
>- //
>- // Return the first info handle.
>- //
>- *UserInfo = (EFI_USER_INFO_HANDLE) mUsbInfoHandle->Info[0];
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Find information handle in credential info table.
>- //
>- for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {
>- Info = mUsbInfoHandle->Info[Index];
>- if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {
>- //
>- // The handle is found, get the next one.
>- //
>- if (Index == mUsbInfoHandle->Count - 1) {
>- //
>- // Already last one.
>- //
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>- }
>- Index++;
>- *UserInfo = (EFI_USER_INFO_HANDLE)mUsbInfoHandle->Info[Index];
>- return EFI_SUCCESS;
>- }
>- }
>-
>- *UserInfo = NULL;
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Delete a user on this credential provider.
>-
>- This function deletes a user on this credential provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle to delete.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>deletion on the user profile handle.
>- Either the user profile cannot delete on any user profile or
>cannot delete
>- on a user profile other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>deletion in the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be deleted
>because of a device error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDelete (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINT8 *UserId;
>- UINT8 *NewUserId;
>- UINTN Index;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Get User Identifier.
>- //
>- UserInfo = NULL;
>- Status = FindUserInfoByType (
>- User,
>- EFI_USER_INFO_IDENTIFIER_RECORD,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Find the user by user identifier in mPwdTable.
>- //
>- for (Index = 0; Index < mUsbTable->Count; Index++) {
>- UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;
>- NewUserId = (UINT8 *) (UserInfo + 1);
>- if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER))
>== 0) {
>- //
>- // Found the user, delete it.
>- //
>- ModifyTable (Index, NULL);
>- break;
>- }
>- }
>-
>- FreePool (UserInfo);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Main entry for this driver.
>-
>- @param ImageHandle Image handle this driver.
>- @param SystemTable Pointer to SystemTable.
>-
>- @retval EFI_SUCESS This function always complete successfully.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UsbProviderInit (
>- IN EFI_HANDLE ImageHandle,
>- IN EFI_SYSTEM_TABLE *SystemTable
>- )
>-{
>- EFI_STATUS Status;
>-
>- //
>- // It is NOT robust enough to be included in production.
>- //
>- #error "This implementation is just a sample, please comment this line if you
>really want to use this driver."
>-
>- //
>- // Init credential table.
>- //
>- Status = InitCredentialTable ();
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Init Form Browser
>- //
>- Status = InitFormBrowser ();
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Install protocol interfaces for the Usb Credential Provider.
>- //
>- Status = gBS->InstallProtocolInterface (
>- &mCallbackInfo->DriverHandle,
>- &gEfiUserCredential2ProtocolGuid,
>- EFI_NATIVE_INTERFACE,
>- &gUsbCredentialProviderDriver
>- );
>- return Status;
>-}
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.h
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.h
>deleted file mode 100644
>index 63f6576045..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.h
>+++ /dev/null
>@@ -1,361 +0,0 @@
>-/** @file
>- Usb Credential Provider driver header file.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef _USB_CREDENTIAL_PROVIDER_H_
>-#define _USB_CREDENTIAL_PROVIDER_H_
>-
>-#include <Uefi.h>
>-
>-#include <Guid/GlobalVariable.h>
>-#include <Guid/FileInfo.h>
>-#include <Guid/SecurityPkgTokenSpace.h>
>-#include <Guid/UsbCredentialProviderHii.h>
>-
>-#include <Protocol/SimpleFileSystem.h>
>-#include <Protocol/BlockIo.h>
>-#include <Protocol/UserCredential2.h>
>-#include <Protocol/UserManager.h>
>-
>-#include <Library/UefiRuntimeServicesTableLib.h>
>-#include <Library/UefiBootServicesTableLib.h>
>-#include <Library/MemoryAllocationLib.h>
>-#include <Library/BaseMemoryLib.h>
>-#include <Library/DevicePathLib.h>
>-#include <Library/BaseCryptLib.h>
>-#include <Library/DebugLib.h>
>-#include <Library/UefiLib.h>
>-#include <Library/PrintLib.h>
>-#include <Library/HiiLib.h>
>-#include <Library/PcdLib.h>
>-
>-extern UINT8 UsbCredentialProviderStrings[];
>-
>-#define USB_TABLE_INC 16
>-#define HASHED_CREDENTIAL_LEN 20
>-
>-//
>-// Save the enroll user credential Information.
>-//
>-typedef struct {
>- EFI_USER_INFO_IDENTIFIER UserId;
>- UINT8 Token[HASHED_CREDENTIAL_LEN];
>-} USB_INFO;
>-
>-//
>-// USB Credential Table.
>-//
>-typedef struct {
>- UINTN Count;
>- UINTN MaxCount;
>- USB_INFO UserInfo[1];
>-} CREDENTIAL_TABLE;
>-
>-//
>-// The user information on the USB provider.
>-//
>-typedef struct {
>- UINTN Count;
>- EFI_USER_INFO *Info[1];
>-} USB_CREDENTIAL_INFO;
>-
>-#define USB_PROVIDER_SIGNATURE SIGNATURE_32 ('U', 'S', 'B', 'P')
>-
>-typedef struct {
>- UINTN Signature;
>- EFI_HANDLE DriverHandle;
>- EFI_HII_HANDLE HiiHandle;
>-} USB_PROVIDER_CALLBACK_INFO;
>-
>-/**
>- Enroll a user on a credential provider.
>-
>- This function enrolls and deletes a user profile using this credential provider.
>- If a user profile is successfully enrolled, it calls the User Manager Protocol
>- function Notify() to notify the user manager driver that credential
>information
>- has changed. If an enrolled user does exist, delete the user on the
>credential
>- provider.
>-
>- @param[in] This Points to this instance of
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile to enroll.
>-
>- @retval EFI_SUCCESS User profile was successfully enrolled.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>enrollment on the
>- user profile handle. Either the user profile cannot enroll
>- on any user profile or cannot enroll on a user profile
>- other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>enrollment in
>- the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be created
>because of a device
>- error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialEnroll (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-/**
>- Returns the user interface information used during user identification.
>-
>- This function enrolls a user on this credential provider. If the user exists on
>- this credential provider, update the user information on this credential
>provider;
>- otherwise delete the user information on credential provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] FormSetId On return, holds the identifier of the form set
>which contains
>- the form used during user identification.
>- @param[out] FormId On return, holds the identifier of the form used
>during user
>- identification.
>-
>- @retval EFI_SUCCESS Form returned successfully.
>- @retval EFI_NOT_FOUND Form not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or FormSetId is NULL or
>FormId is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialForm (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_GUID *FormSetId,
>- OUT EFI_FORM_ID *FormId
>- );
>-
>-/**
>- Returns bitmap used to describe the credential provider type.
>-
>- This optional function returns a bitmap which is less than or equal to the
>number
>- of pixels specified by Width and Height. If no such bitmap exists, then
>EFI_NOT_FOUND
>- is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] Width On entry, points to the desired bitmap width. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- width of the bitmap returned.
>- @param[in, out] Height On entry, points to the desired bitmap height. If
>NULL then no
>- bitmap information will be returned. On exit, points to the
>- height of the bitmap returned.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] Image On return, holds the HII image identifier.
>-
>- @retval EFI_SUCCESS Image identifier returned successfully.
>- @retval EFI_NOT_FOUND Image identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or Image is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTile (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT UINTN *Width,
>- IN OUT UINTN *Height,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_IMAGE_ID *Image
>- );
>-
>-/**
>- Returns string used to describe the credential provider type.
>-
>- This function returns a string which describes the credential provider. If no
>- such string exists, then EFI_NOT_FOUND is returned.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] Hii On return, holds the HII database handle.
>- @param[out] String On return, holds the HII string identifier.
>-
>- @retval EFI_SUCCESS String identifier returned successfully.
>- @retval EFI_NOT_FOUND String identifier not returned.
>- @retval EFI_INVALID_PARAMETER Hii is NULL or String is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialTitle (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_HII_HANDLE *Hii,
>- OUT EFI_STRING_ID *String
>- );
>-
>-/**
>- Return the user identifier associated with the currently authenticated user.
>-
>- This function returns the user identifier of the user authenticated by this
>credential
>- provider. This function is called after the credential-related information has
>been
>- submitted on a form OR after a call to Default() has returned that this
>credential is
>- ready to log on.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle of the user profile currently
>being
>- considered by the user identity manager. If NULL, then no user
>- profile is currently under consideration.
>- @param[out] Identifier On return, points to the user identifier.
>-
>- @retval EFI_SUCCESS User identifier returned successfully.
>- @retval EFI_NOT_READY No user identifier can be returned.
>- @retval EFI_ACCESS_DENIED The user has been locked out of this user
>credential.
>- @retval EFI_INVALID_PARAMETER This is NULL, or Identifier is NULL.
>- @retval EFI_NOT_FOUND User is not NULL, and the specified user
>handle can't be
>- found in user profile database.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialUser (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- OUT EFI_USER_INFO_IDENTIFIER *Identifier
>- );
>-
>-/**
>- Indicate that user interface interaction has begun for the specified
>credential.
>-
>- This function is called when a credential provider is selected by the user. If
>- AutoLogon returns FALSE, then the user interface will be constructed by the
>User
>- Identity Manager.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, points to the credential provider's
>capabilities
>- after the credential provider has been selected by the user.
>-
>- @retval EFI_SUCCESS Credential provider successfully selected.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialSelect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- );
>-
>-/**
>- Indicate that user interface interaction has ended for the specified
>credential.
>-
>- This function is called when a credential provider is deselected by the user.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>-
>- @retval EFI_SUCCESS Credential provider successfully deselected.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDeselect (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This
>- );
>-
>-/**
>- Return the default logon behavior for this user credential.
>-
>- This function reports the default login behavior regarding this credential
>provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[out] AutoLogon On return, holds whether the credential provider
>should be used
>- by default to automatically log on the user.
>-
>- @retval EFI_SUCCESS Default information successfully returned.
>- @retval EFI_INVALID_PARAMETER AutoLogon is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDefault (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- OUT EFI_CREDENTIAL_LOGON_FLAGS *AutoLogon
>- );
>-
>-/**
>- Return information attached to the credential provider.
>-
>- This function returns user information.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] UserInfo Handle of the user information data record.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes. On
>- exit, holds the user information. If the buffer is too small
>- to hold the information, then EFI_BUFFER_TOO_SMALL is
>returned
>- and InfoSize is updated to contain the number of bytes
>actually
>- required.
>- @param[in, out] InfoSize On entry, points to the size of Info. On return,
>points to the
>- size of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_BUFFER_TOO_SMALL The size specified by InfoSize is too small
>to hold all of the
>- user information. The size required is returned in *InfoSize.
>- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
>- @retval EFI_NOT_FOUND The specified UserInfo does not refer to a
>valid user info handle.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- );
>-
>-/**
>- Enumerate all of the user informations on the credential provider.
>-
>- This function returns the next user information record. To retrieve the first
>user
>- information record handle, point UserInfo at a NULL. Each subsequent call
>will retrieve
>- another user information record handle until there are no more, at which
>point UserInfo
>- will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in, out] UserInfo On entry, points to the previous user information
>handle or NULL
>- to start enumeration. On exit, points to the next user
>information
>- handle or NULL if there is no more user information.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialGetNextInfo (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- );
>-
>-/**
>- Delete a user on this credential provider.
>-
>- This function deletes a user on this credential provider.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL.
>- @param[in] User The user profile handle to delete.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user profile does not permit
>deletion on the user profile handle.
>- Either the user profile cannot delete on any user profile or
>cannot delete
>- on a user profile other than the current user profile.
>- @retval EFI_UNSUPPORTED This credential provider does not support
>deletion in the pre-OS.
>- @retval EFI_DEVICE_ERROR The new credential could not be deleted
>because of a device error.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile handle.
>-**/
>-EFI_STATUS
>-EFIAPI
>-CredentialDelete (
>- IN CONST EFI_USER_CREDENTIAL2_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.uni
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.uni
>deleted file mode 100644
>index 961e09f360..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>ovider.uni
>+++ /dev/null
>@@ -1,23 +0,0 @@
>-// /** @file
>-// Provides a USB credential provider implementation
>-//
>-// This module reads a token from a token file that is saved in the root
>-// folder of a USB stick. The token file name can be specified by the PCD
>-// PcdFixedUsbCredentialProviderTokenFileName.
>-//
>-// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-
>-#string STR_MODULE_ABSTRACT #language en-US "Provides a USB
>credential provider implementation"
>-
>-#string STR_MODULE_DESCRIPTION #language en-US "This module
>reads a token from a token file that is saved in the root folder of a USB stick.
>The token file name can be specified by the PCD
>PcdFixedUsbCredentialProviderTokenFileName."
>-
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderDxe.inf
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderDxe.inf
>deleted file mode 100644
>index 1e8e42332f..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderDxe.inf
>+++ /dev/null
>@@ -1,70 +0,0 @@
>-## @file
>-# Provides a USB credential provider implementation
>-#
>-# This module reads a token from a token file that is saved in the root
>-# folder of a USB stick. The token file name can be specified by the PCD
>-# PcdFixedUsbCredentialProviderTokenFileName.
>-#
>-# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-# This program and the accompanying materials
>-# are licensed and made available under the terms and conditions of the BSD
>License
>-# which accompanies this distribution. The full text of the license may be
>found at
>-# http://opensource.org/licenses/bsd-license.php
>-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-#
>-##
>-
>-[Defines]
>- INF_VERSION = 0x00010005
>- BASE_NAME = UsbCredentialProvider
>- MODULE_UNI_FILE = UsbCredentialProvider.uni
>- FILE_GUID = 672A0C68-2BF0-46f9-93C3-C4E7DC0FA555
>- MODULE_TYPE = UEFI_DRIVER
>- VERSION_STRING = 1.0
>- ENTRY_POINT = UsbProviderInit
>-
>-[Sources]
>- UsbCredentialProvider.c
>- UsbCredentialProvider.h
>- UsbCredentialProviderStrings.uni
>-
>-[Packages]
>- MdePkg/MdePkg.dec
>- MdeModulePkg/MdeModulePkg.dec
>- CryptoPkg/CryptoPkg.dec
>- SecurityPkg/SecurityPkg.dec
>-
>-[LibraryClasses]
>- UefiRuntimeServicesTableLib
>- UefiBootServicesTableLib
>- UefiDriverEntryPoint
>- MemoryAllocationLib
>- BaseMemoryLib
>- DebugLib
>- HiiLib
>- UefiLib
>- BaseCryptLib
>-
>-[Guids]
>- ## PRODUCES ## Variable:L"UsbCredential"
>- ## CONSUMES ## Variable:L"UsbCredential"
>- ## CONSUMES ## HII
>- ## SOMETIMES_CONSUMES ## GUID # The credential provider
>identifier
>- gUsbCredentialProviderGuid
>-
>- gEfiFileInfoGuid ## SOMETIMES_CONSUMES ## GUID
>- gEfiUserCredentialClassSecureCardGuid ## SOMETIMES_CONSUMES
>## GUID
>-
>-[Pcd]
>-
>gEfiSecurityPkgTokenSpaceGuid.PcdFixedUsbCredentialProviderTokenFileNa
>me ## SOMETIMES_CONSUMES
>-
>-[Protocols]
>- gEfiUserCredential2ProtocolGuid ## PRODUCES
>- gEfiUserManagerProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES
>-
>-[UserExtensions.TianoCore."ExtraFiles"]
>- UsbCredentialProviderExtra.uni
>-
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderExtra.uni
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderExtra.uni
>deleted file mode 100644
>index a20917d5f7..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderExtra.uni
>+++ /dev/null
>@@ -1,19 +0,0 @@
>-// /** @file
>-// UsbCredentialProvider Localized Strings and Content
>-//
>-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-#string STR_PROPERTIES_MODULE_NAME
>-#language en-US
>-"USB Credential Provider"
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderStrings.uni
>b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderStrings.uni
>deleted file mode 100644
>index f306d50a4e..0000000000
>---
>a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialPr
>oviderStrings.uni
>+++ /dev/null
>@@ -1,29 +0,0 @@
>-/** @file
>- String definitions for the USB Credential Provider.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php.
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#langdef en-US "English"
>-#langdef fr-FR "Francais"
>-
>-#string STR_CREDENTIAL_TITLE #language en-US "USB Credential
>Provider"
>- #language fr-FR "USB Credential Provider (French)"
>-#string STR_NULL_STRING #language en-US ""
>- #language fr-FR ""
>-#string STR_PROVIDER_NAME #language en-US "INTEL USB
>Credential Provider"
>- #language fr-FR "INTEL USB Credential Provider
>(French)"
>-#string STR_PROVIDER_TYPE_NAME #language en-US "Secure Card
>Credential Provider"
>- #language fr-FR "Secure Card Credential Provider
>(French)"
>-#string STR_READ_USB_TOKEN_ERROR #language en-US "Read USB
>Token File Error!"
>- #language fr-FR "Read USB Token File Error!
>(French)"
>-#string STR_INSERT_USB_TOKEN #language en-US "Please insert
>USB key with Token"
>- #language fr-FR "Please insert USB key with Token
>(French)"
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/LoadDeferredIma
>ge.c
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/LoadDeferredIm
>age.c
>deleted file mode 100644
>index 2cfe130db8..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/LoadDeferredIma
>ge.c
>+++ /dev/null
>@@ -1,148 +0,0 @@
>-/** @file
>- Load the deferred images after user is identified.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserIdentifyManager.h"
>-
>-EFI_HANDLE mDeferredImageHandle;
>-
>-/**
>- The function will load all the deferred images again. If the deferred image is
>loaded
>- successfully, try to start it.
>-
>- @param Event Event whose notification function is being invoked.
>- @param Context Pointer to the notification function's context
>-
>-**/
>-VOID
>-EFIAPI
>-LoadDeferredImage (
>- IN EFI_EVENT Event,
>- IN VOID *Context
>- )
>-{
>- EFI_STATUS Status;
>- EFI_DEFERRED_IMAGE_LOAD_PROTOCOL *DeferredImage;
>- UINTN HandleCount;
>- EFI_HANDLE *HandleBuf;
>- UINTN Index;
>- UINTN DriverIndex;
>- EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
>- VOID *DriverImage;
>- UINTN ImageSize;
>- BOOLEAN BootOption;
>- EFI_HANDLE ImageHandle;
>- UINTN ExitDataSize;
>- CHAR16 *ExitData;
>-
>- //
>- // Find all the deferred image load protocols.
>- //
>- HandleCount = 0;
>- HandleBuf = NULL;
>- Status = gBS->LocateHandleBuffer (
>- ByProtocol,
>- &gEfiDeferredImageLoadProtocolGuid,
>- NULL,
>- &HandleCount,
>- &HandleBuf
>- );
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>-
>- for (Index = 0; Index < HandleCount; Index++) {
>- Status = gBS->HandleProtocol (
>- HandleBuf[Index],
>- &gEfiDeferredImageLoadProtocolGuid,
>- (VOID **) &DeferredImage
>- );
>- if (EFI_ERROR (Status)) {
>- continue ;
>- }
>-
>- DriverIndex = 0;
>- do {
>- //
>- // Load all the deferred images in this protocol instance.
>- //
>- Status = DeferredImage->GetImageInfo(
>- DeferredImage,
>- DriverIndex,
>- &ImageDevicePath,
>- (VOID **) &DriverImage,
>- &ImageSize,
>- &BootOption
>- );
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- //
>- // Load and start the image.
>- //
>- Status = gBS->LoadImage (
>- BootOption,
>- mDeferredImageHandle,
>- ImageDevicePath,
>- NULL,
>- 0,
>- &ImageHandle
>- );
>- if (!EFI_ERROR (Status)) {
>- //
>- // Before calling the image, enable the Watchdog Timer for
>- // a 5 Minute period
>- //
>- gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);
>- Status = gBS->StartImage (ImageHandle, &ExitDataSize, &ExitData);
>-
>- //
>- // Clear the Watchdog Timer after the image returns.
>- //
>- gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
>- }
>- DriverIndex++;
>- } while (TRUE);
>- }
>- FreePool (HandleBuf);
>-}
>-
>-
>-/**
>- Register an event notification function for user profile changed.
>-
>- @param[in] ImageHandle Image handle this driver.
>-
>-**/
>-VOID
>-LoadDeferredImageInit (
>- IN EFI_HANDLE ImageHandle
>- )
>-{
>- EFI_STATUS Status;
>- EFI_EVENT Event;
>-
>- mDeferredImageHandle = ImageHandle;
>-
>- Status = gBS->CreateEventEx (
>- EVT_NOTIFY_SIGNAL,
>- TPL_CALLBACK,
>- LoadDeferredImage,
>- NULL,
>- &gEfiEventUserProfileChangedGuid,
>- &Event
>- );
>-
>- ASSERT (Status == EFI_SUCCESS);
>-}
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.c
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.c
>deleted file mode 100644
>index fd941792c1..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.c
>+++ /dev/null
>@@ -1,3766 +0,0 @@
>-/** @file
>- This driver manages user information and produces user manager protocol.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserIdentifyManager.h"
>-
>-//
>-// Default user name.
>-//
>-CHAR16 mUserName[] = L"Administrator";
>-
>-//
>-// Points to the user profile database.
>-//
>-USER_PROFILE_DB *mUserProfileDb = NULL;
>-
>-//
>-// Points to the credential providers found in system.
>-//
>-CREDENTIAL_PROVIDER_INFO *mProviderDb = NULL;
>-
>-//
>-// Current user shared in multi function.
>-//
>-EFI_USER_PROFILE_HANDLE mCurrentUser = NULL;
>-
>-//
>-// Flag indicates a user is identified.
>-//
>-BOOLEAN mIdentified = FALSE;
>-USER_MANAGER_CALLBACK_INFO *mCallbackInfo = NULL;
>-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
>- {
>- {
>- HARDWARE_DEVICE_PATH,
>- HW_VENDOR_DP,
>- {
>- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
>- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
>- }
>- },
>- USER_IDENTIFY_MANAGER_GUID
>- },
>- {
>- END_DEVICE_PATH_TYPE,
>- END_ENTIRE_DEVICE_PATH_SUBTYPE,
>- {
>- (UINT8) (END_DEVICE_PATH_LENGTH),
>- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
>- }
>- }
>-};
>-
>-
>-EFI_USER_MANAGER_PROTOCOL gUserIdentifyManager = {
>- UserProfileCreate,
>- UserProfileDelete,
>- UserProfileGetNext,
>- UserProfileCurrent,
>- UserProfileIdentify,
>- UserProfileFind,
>- UserProfileNotify,
>- UserProfileGetInfo,
>- UserProfileSetInfo,
>- UserProfileDeleteInfo,
>- UserProfileGetNextInfo,
>-};
>-
>-
>-/**
>- Find the specified user in the user database.
>-
>- This function searches the specified user from the beginning of the user
>database.
>- And if NextUser is TRUE, return the next User in the user database.
>-
>- @param[in, out] User On entry, points to the user profile entry to
>search.
>- On return, points to the user profile entry or NULL if not
>found.
>- @param[in] NextUser If FALSE, find the user in user profile database
>specifyed by User
>- If TRUE, find the next user in user profile database specifyed
>- by User.
>- @param[out] ProfileIndex A pointer to the index of user profile database
>that matches the
>- user specifyed by User.
>-
>- @retval EFI_NOT_FOUND User was NULL, or User was not found, or the
>next user was not found.
>- @retval EFI_SUCCESS User or the next user are found in user profile
>database
>-
>-**/
>-EFI_STATUS
>-FindUserProfile (
>- IN OUT USER_PROFILE_ENTRY **User,
>- IN BOOLEAN NextUser,
>- OUT UINTN *ProfileIndex OPTIONAL
>- )
>-{
>- UINTN Index;
>-
>- //
>- // Check parameters
>- //
>- if ((mUserProfileDb == NULL) || (User == NULL)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- //
>- // Check whether the user profile is in the user profile database.
>- //
>- for (Index = 0; Index < mUserProfileDb->UserProfileNum; Index++) {
>- if (mUserProfileDb->UserProfile[Index] == *User) {
>- if (ProfileIndex != NULL) {
>- *ProfileIndex = Index;
>- }
>- break;
>- }
>- }
>-
>- if (NextUser) {
>- //
>- // Find the next user profile.
>- //
>- Index++;
>- if (Index < mUserProfileDb->UserProfileNum) {
>- *User = mUserProfileDb->UserProfile[Index];
>- } else if (Index == mUserProfileDb->UserProfileNum) {
>- *User = NULL;
>- return EFI_NOT_FOUND;
>- } else {
>- if ((mUserProfileDb->UserProfileNum > 0) && (*User == NULL)) {
>- *User = mUserProfileDb->UserProfile[0];
>- } else {
>- *User = NULL;
>- return EFI_NOT_FOUND;
>- }
>- }
>- } else if (Index == mUserProfileDb->UserProfileNum) {
>- return EFI_NOT_FOUND;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-/**
>- Find the specified user information record in the specified User profile.
>-
>- This function searches the specified user information record from the
>beginning of the user
>- profile. And if NextInfo is TRUE, return the next info in the user profile.
>-
>- @param[in] User Points to the user profile entry.
>- @param[in, out] Info On entry, points to the user information record or
>NULL to start
>- searching with the first user information record.
>- On return, points to the user information record or NULL if not
>found.
>- @param[in] NextInfo If FALSE, find the user information record in profile
>specifyed by User.
>- If TRUE, find the next user information record in profile
>specifyed
>- by User.
>- @param[out] Offset A pointer to the offset of the information record in
>the user profile.
>-
>- @retval EFI_INVALID_PARAMETER Info is NULL
>- @retval EFI_NOT_FOUND Info was not found, or the next Info was not
>found.
>- @retval EFI_SUCCESS Info or the next info are found in user profile.
>-
>-**/
>-EFI_STATUS
>-FindUserInfo (
>- IN USER_PROFILE_ENTRY * User,
>- IN OUT EFI_USER_INFO **Info,
>- IN BOOLEAN NextInfo,
>- OUT UINTN *Offset OPTIONAL
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINTN InfoLen;
>-
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check user profile entry
>- //
>- Status = FindUserProfile (&User, FALSE, NULL);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Find user information in the specified user record.
>- //
>- InfoLen = 0;
>- while (InfoLen < User->UserProfileSize) {
>- UserInfo = (EFI_USER_INFO *) (User->ProfileInfo + InfoLen);
>- if (UserInfo == *Info) {
>- if (Offset != NULL) {
>- *Offset = InfoLen;
>- }
>- break;
>- }
>- InfoLen += ALIGN_VARIABLE (UserInfo->InfoSize);
>- }
>-
>- //
>- // Check whether to find the next user information.
>- //
>- if (NextInfo) {
>- if (InfoLen < User->UserProfileSize) {
>- UserInfo = (EFI_USER_INFO *) (User->ProfileInfo + InfoLen);
>- InfoLen += ALIGN_VARIABLE (UserInfo->InfoSize);
>- if (InfoLen < User->UserProfileSize) {
>- *Info = (EFI_USER_INFO *) (User->ProfileInfo + InfoLen);
>- if (Offset != NULL) {
>- *Offset = InfoLen;
>- }
>- } else if (InfoLen == User->UserProfileSize) {
>- *Info = NULL;
>- return EFI_NOT_FOUND;
>- }
>- } else {
>- if (*Info == NULL) {
>- *Info = (EFI_USER_INFO *) User->ProfileInfo;
>- if (Offset != NULL) {
>- *Offset = 0;
>- }
>- } else {
>- *Info = NULL;
>- return EFI_NOT_FOUND;
>- }
>- }
>- } else if (InfoLen == User->UserProfileSize) {
>- return EFI_NOT_FOUND;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-/**
>- Find a user infomation record by the information record type.
>-
>- This function searches all user information records of User. The search starts
>with the
>- user information record following Info and continues until either the
>information is found
>- or there are no more user infomation record.
>- A match occurs when a Info.InfoType field matches the user information
>record type.
>-
>- @param[in] User Points to the user profile record to search.
>- @param[in, out] Info On entry, points to the user information record or
>NULL to start
>- searching with the first user information record.
>- On return, points to the user information record or NULL if not
>found.
>- @param[in] InfoType The infomation type to be searched.
>-
>- @retval EFI_SUCCESS User information was found. Info points to the
>user information record.
>- @retval EFI_NOT_FOUND User information was not found.
>- @retval EFI_INVALID_PARAMETER User is NULL or Info is NULL.
>-
>-**/
>-EFI_STATUS
>-FindUserInfoByType (
>- IN USER_PROFILE_ENTRY *User,
>- IN OUT EFI_USER_INFO **Info,
>- IN UINT8 InfoType
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>- UINTN InfoLen;
>-
>- if (Info == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check whether the user has the specified user information.
>- //
>- InfoLen = 0;
>- if (*Info == NULL) {
>- Status = FindUserProfile (&User, FALSE, NULL);
>- } else {
>- Status = FindUserInfo (User, Info, TRUE, &InfoLen);
>- }
>-
>- if (EFI_ERROR (Status)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- while (InfoLen < User->UserProfileSize) {
>- UserInfo = (EFI_USER_INFO *) (User->ProfileInfo + InfoLen);
>- if (UserInfo->InfoType == InfoType) {
>- if (UserInfo != *Info) {
>- *Info = UserInfo;
>- return EFI_SUCCESS;
>- }
>- }
>-
>- InfoLen += ALIGN_VARIABLE (UserInfo->InfoSize);
>- }
>-
>- *Info = NULL;
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- Find a user using a user information record.
>-
>- This function searches all user profiles for the specified user information
>record. The
>- search starts with the user information record handle following UserInfo
>and continues
>- until either the information is found or there are no more user profiles.
>- A match occurs when the Info.InfoType field matches the user information
>record type and the
>- user information record data matches the portion of Info passed the
>EFI_USER_INFO header.
>-
>- @param[in, out] User On entry, points to the previously returned user
>profile record,
>- or NULL to start searching with the first user profile.
>- On return, points to the user profile entry, or NULL if not found.
>- @param[in, out] UserInfo On entry, points to the previously returned user
>information record,
>- or NULL to start searching with the first.
>- On return, points to the user information record, or NULL if not
>found.
>- @param[in] Info Points to the buffer containing the user information to
>be compared
>- to the user information record.
>- @param[in] InfoSize The size of Info, in bytes. Same as Info->InfoSize.
>-
>- @retval EFI_SUCCESS User information was found. User points to the
>user profile record,
>- and UserInfo points to the user information record.
>- @retval EFI_NOT_FOUND User information was not found.
>- @retval EFI_INVALID_PARAMETER User is NULL; Info is NULL; or, InfoSize is
>too small.
>-
>-**/
>-EFI_STATUS
>-FindUserProfileByInfo (
>- IN OUT USER_PROFILE_ENTRY **User,
>- IN OUT EFI_USER_INFO **UserInfo, OPTIONAL
>- IN EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *InfoEntry;
>-
>-
>- if ((User == NULL) || (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (InfoSize < sizeof (EFI_USER_INFO)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (UserInfo != NULL) {
>- InfoEntry = *UserInfo;
>- } else {
>- InfoEntry = NULL;
>- }
>- //
>- // Find user profile according to information.
>- //
>- if (*User == NULL) {
>- *User = mUserProfileDb->UserProfile[0];
>- }
>-
>- //
>- // Check user profile handle.
>- //
>- Status = FindUserProfile (User, FALSE, NULL);
>-
>- while (!EFI_ERROR (Status)) {
>- //
>- // Find the user information in a user profile.
>- //
>- while (TRUE) {
>- Status = FindUserInfoByType (*User, &InfoEntry, Info->InfoType);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- if (InfoSize == Info->InfoSize) {
>- if (CompareMem ((UINT8 *) (InfoEntry + 1), (UINT8 *) (Info + 1), InfoSize
>- sizeof (EFI_USER_INFO)) == 0) {
>- //
>- // Found the infomation record.
>- //
>- if (UserInfo != NULL) {
>- *UserInfo = InfoEntry;
>- }
>- return EFI_SUCCESS;
>- }
>- }
>- }
>-
>- //
>- // Get next user profile.
>- //
>- InfoEntry = NULL;
>- Status = FindUserProfile (User, TRUE, NULL);
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Check whether the access policy is valid.
>-
>- @param[in] PolicyInfo Point to the access policy.
>- @param[in] InfoLen The policy length.
>-
>- @retval TRUE The policy is a valid access policy.
>- @retval FALSE The access policy is not a valid access policy.
>-
>-**/
>-BOOLEAN
>-CheckAccessPolicy (
>- IN UINT8 *PolicyInfo,
>- IN UINTN InfoLen
>- )
>-{
>- UINTN TotalLen;
>- UINTN ValueLen;
>- UINTN OffSet;
>- EFI_USER_INFO_ACCESS_CONTROL Access;
>- EFI_DEVICE_PATH_PROTOCOL *Path;
>- UINTN PathSize;
>-
>- TotalLen = 0;
>- while (TotalLen < InfoLen) {
>- //
>- // Check access policy according to type.
>- //
>- CopyMem (&Access, PolicyInfo + TotalLen, sizeof (Access));
>- ValueLen = Access.Size - sizeof (EFI_USER_INFO_ACCESS_CONTROL);
>- switch (Access.Type) {
>- case EFI_USER_INFO_ACCESS_FORBID_LOAD:
>- case EFI_USER_INFO_ACCESS_PERMIT_LOAD:
>- case EFI_USER_INFO_ACCESS_FORBID_CONNECT:
>- case EFI_USER_INFO_ACCESS_PERMIT_CONNECT:
>- OffSet = 0;
>- while (OffSet < ValueLen) {
>- Path = (EFI_DEVICE_PATH_PROTOCOL *) (PolicyInfo + TotalLen +
>sizeof (Access) + OffSet);
>- PathSize = GetDevicePathSize (Path);
>- OffSet += PathSize;
>- }
>- if (OffSet != ValueLen) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_SETUP:
>- if (ValueLen % sizeof (EFI_GUID) != 0) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_BOOT_ORDER:
>- if (ValueLen % sizeof (EFI_USER_INFO_ACCESS_BOOT_ORDER_HDR) != 0)
>{
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_ENROLL_SELF:
>- case EFI_USER_INFO_ACCESS_ENROLL_OTHERS:
>- case EFI_USER_INFO_ACCESS_MANAGE:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- default:
>- return FALSE;
>- break;
>- }
>-
>- TotalLen += Access.Size;
>- }
>-
>- if (TotalLen != InfoLen) {
>- return FALSE;
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Check whether the identity policy is valid.
>-
>- @param[in] PolicyInfo Point to the identity policy.
>- @param[in] InfoLen The policy length.
>-
>- @retval TRUE The policy is a valid identity policy.
>- @retval FALSE The access policy is not a valid identity policy.
>-
>-**/
>-BOOLEAN
>-CheckIdentityPolicy (
>- IN UINT8 *PolicyInfo,
>- IN UINTN InfoLen
>- )
>-{
>- UINTN TotalLen;
>- UINTN ValueLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>-
>- TotalLen = 0;
>-
>- //
>- // Check each part of policy expression.
>- //
>- while (TotalLen < InfoLen) {
>- //
>- // Check access polisy according to type.
>- //
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (PolicyInfo + TotalLen);
>- ValueLen = Identity->Length - sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- switch (Identity->Type) {
>- //
>- // Check False option.
>- //
>- case EFI_USER_INFO_IDENTITY_FALSE:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check True option.
>- //
>- case EFI_USER_INFO_IDENTITY_TRUE:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check negative operation.
>- //
>- case EFI_USER_INFO_IDENTITY_NOT:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check and operation.
>- //
>- case EFI_USER_INFO_IDENTITY_AND:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check or operation.
>- //
>- case EFI_USER_INFO_IDENTITY_OR:
>- if (ValueLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check credential provider by type.
>- //
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:
>- if (ValueLen != sizeof (EFI_GUID)) {
>- return FALSE;
>- }
>- break;
>-
>- //
>- // Check credential provider by ID.
>- //
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
>- if (ValueLen != sizeof (EFI_GUID)) {
>- return FALSE;
>- }
>- break;
>-
>- default:
>- return FALSE;
>- break;
>- }
>-
>- TotalLen += Identity->Length;
>- }
>-
>- if (TotalLen != InfoLen) {
>- return FALSE;
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Check whether the user information is a valid user information record.
>-
>- @param[in] Info points to the user information.
>-
>- @retval TRUE The info is a valid user information record.
>- @retval FALSE The info is not a valid user information record.
>-
>-**/
>-BOOLEAN
>-CheckUserInfo (
>- IN CONST EFI_USER_INFO *Info
>- )
>-{
>- UINTN InfoLen;
>-
>- if (Info == NULL) {
>- return FALSE;
>- }
>- //
>- // Check user information according to information type.
>- //
>- InfoLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- switch (Info->InfoType) {
>- case EFI_USER_INFO_EMPTY_RECORD:
>- if (InfoLen != 0) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_NAME_RECORD:
>- case EFI_USER_INFO_CREDENTIAL_TYPE_NAME_RECORD:
>- case EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD:
>- break;
>-
>- case EFI_USER_INFO_CREATE_DATE_RECORD:
>- case EFI_USER_INFO_USAGE_DATE_RECORD:
>- if (InfoLen != sizeof (EFI_TIME)) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_USAGE_COUNT_RECORD:
>- if (InfoLen != sizeof (UINT64)) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_IDENTIFIER_RECORD:
>- if (InfoLen != 16) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_CREDENTIAL_TYPE_RECORD:
>- case EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD:
>- case EFI_USER_INFO_GUID_RECORD:
>- if (InfoLen != sizeof (EFI_GUID)) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_PKCS11_RECORD:
>- case EFI_USER_INFO_CBEFF_RECORD:
>- break;
>-
>- case EFI_USER_INFO_FAR_RECORD:
>- case EFI_USER_INFO_RETRY_RECORD:
>- if (InfoLen != 1) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_POLICY_RECORD:
>- if(!CheckAccessPolicy ((UINT8 *) (Info + 1), InfoLen)) {
>- return FALSE;
>- }
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_POLICY_RECORD:
>- if (!CheckIdentityPolicy ((UINT8 *) (Info + 1), InfoLen)) {
>- return FALSE;
>- }
>- break;
>-
>- default:
>- return FALSE;
>- break;
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Check the user profile data format to be added.
>-
>- @param[in] UserProfileInfo Points to the user profile data.
>- @param[in] UserProfileSize The length of user profile data.
>-
>- @retval TRUE It is a valid user profile.
>- @retval FALSE It is not a valid user profile.
>-
>-**/
>-BOOLEAN
>-CheckProfileInfo (
>- IN UINT8 *UserProfileInfo,
>- IN UINTN UserProfileSize
>- )
>-{
>- UINTN ChkLen;
>- EFI_USER_INFO *Info;
>-
>- if (UserProfileInfo == NULL) {
>- return FALSE;
>- }
>-
>- //
>- // Check user profile information length.
>- //
>- ChkLen = 0;
>- while (ChkLen < UserProfileSize) {
>- Info = (EFI_USER_INFO *) (UserProfileInfo + ChkLen);
>- //
>- // Check user information format.
>- //
>- if (!CheckUserInfo (Info)) {
>- return FALSE;
>- }
>-
>- ChkLen += ALIGN_VARIABLE (Info->InfoSize);
>- }
>-
>- if (ChkLen != UserProfileSize) {
>- return FALSE;
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Find the specified RightType in current user profile.
>-
>- @param[in] RightType Could be EFI_USER_INFO_ACCESS_MANAGE,
>- EFI_USER_INFO_ACCESS_ENROLL_OTHERS or
>- EFI_USER_INFO_ACCESS_ENROLL_SELF.
>-
>- @retval TRUE Find the specified RightType in current user profile.
>- @retval FALSE Can't find the right in the profile.
>-
>-**/
>-BOOLEAN
>-CheckCurrentUserAccessRight (
>- IN UINT32 RightType
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *Info;
>- UINTN TotalLen;
>- UINTN CheckLen;
>- EFI_USER_INFO_ACCESS_CONTROL Access;
>-
>- //
>- // Get user access right information.
>- //
>- Info = NULL;
>- Status = FindUserInfoByType (
>- (USER_PROFILE_ENTRY *) mCurrentUser,
>- &Info,
>- EFI_USER_INFO_ACCESS_POLICY_RECORD
>- );
>- if (EFI_ERROR (Status)) {
>- return FALSE;
>- }
>-
>- ASSERT (Info != NULL);
>- TotalLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- CheckLen = 0;
>- while (CheckLen < TotalLen) {
>- //
>- // Check right according to access type.
>- //
>- CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));
>- if (Access.Type == RightType) {
>- return TRUE;;
>- }
>-
>- CheckLen += Access.Size;
>- }
>-
>- return FALSE;
>-}
>-
>-
>-/**
>- Create a unique user identifier.
>-
>- @param[out] Identifier This points to the identifier.
>-
>-**/
>-VOID
>-GenerateIdentifier (
>- OUT UINT8 *Identifier
>- )
>-{
>- EFI_TIME Time;
>- UINT64 MonotonicCount;
>- UINT32 *MonotonicPointer;
>- UINTN Index;
>-
>- //
>- // Create a unique user identifier.
>- //
>- gRT->GetTime (&Time, NULL);
>- CopyMem (Identifier, &Time, sizeof (EFI_TIME));
>- //
>- // Remove zeros.
>- //
>- for (Index = 0; Index < sizeof (EFI_TIME); Index++) {
>- if (Identifier[Index] == 0) {
>- Identifier[Index] = 0x5a;
>- }
>- }
>-
>- MonotonicPointer = (UINT32 *) Identifier;
>- gBS->GetNextMonotonicCount (&MonotonicCount);
>- MonotonicPointer[0] += (UINT32) MonotonicCount;
>- MonotonicPointer[1] += (UINT32) MonotonicCount;
>- MonotonicPointer[2] += (UINT32) MonotonicCount;
>- MonotonicPointer[3] += (UINT32) MonotonicCount;
>-}
>-
>-
>-/**
>- Generate unique user ID.
>-
>- @param[out] UserId Points to the user identifer.
>-
>-**/
>-VOID
>-GenerateUserId (
>- OUT UINT8 *UserId
>- )
>-{
>- EFI_STATUS Status;
>- USER_PROFILE_ENTRY *UserProfile;
>- EFI_USER_INFO *UserInfo;
>- UINTN Index;
>-
>- //
>- // Generate unique user ID
>- //
>- while (TRUE) {
>- GenerateIdentifier (UserId);
>- //
>- // Check whether it's unique in user profile database.
>- //
>- if (mUserProfileDb == NULL) {
>- return ;
>- }
>-
>- for (Index = 0; Index < mUserProfileDb->UserProfileNum; Index++) {
>- UserProfile = (USER_PROFILE_ENTRY *) (mUserProfileDb-
>>UserProfile[Index]);
>- UserInfo = NULL;
>- Status = FindUserInfoByType (UserProfile, &UserInfo,
>EFI_USER_INFO_IDENTIFIER_RECORD);
>- if (EFI_ERROR (Status)) {
>- continue;
>- }
>-
>- if (CompareMem ((UINT8 *) (UserInfo + 1), UserId, sizeof
>(EFI_USER_INFO_IDENTIFIER)) == 0) {
>- break;
>- }
>- }
>-
>- if (Index == mUserProfileDb->UserProfileNum) {
>- return ;
>- }
>- }
>-}
>-
>-
>-/**
>- Expand user profile database.
>-
>- @retval TRUE Success to expand user profile database.
>- @retval FALSE Fail to expand user profile database.
>-
>-**/
>-BOOLEAN
>-ExpandUsermUserProfileDb (
>- VOID
>- )
>-{
>- UINTN MaxNum;
>- USER_PROFILE_DB *NewDataBase;
>-
>- //
>- // Create new user profile database.
>- //
>- if (mUserProfileDb == NULL) {
>- MaxNum = USER_NUMBER_INC;
>- } else {
>- MaxNum = mUserProfileDb->MaxProfileNum + USER_NUMBER_INC;
>- }
>-
>- NewDataBase = AllocateZeroPool (
>- sizeof (USER_PROFILE_DB) - sizeof (EFI_USER_PROFILE_HANDLE) +
>- MaxNum * sizeof (EFI_USER_PROFILE_HANDLE)
>- );
>- if (NewDataBase == NULL) {
>- return FALSE;
>- }
>-
>- NewDataBase->MaxProfileNum = MaxNum;
>-
>- //
>- // Copy old user profile database value
>- //
>- if (mUserProfileDb == NULL) {
>- NewDataBase->UserProfileNum = 0;
>- } else {
>- NewDataBase->UserProfileNum = mUserProfileDb->UserProfileNum;
>- CopyMem (
>- NewDataBase->UserProfile,
>- mUserProfileDb->UserProfile,
>- NewDataBase->UserProfileNum * sizeof (EFI_USER_PROFILE_HANDLE)
>- );
>- FreePool (mUserProfileDb);
>- }
>-
>- mUserProfileDb = NewDataBase;
>- return TRUE;
>-}
>-
>-
>-/**
>- Expand user profile
>-
>- @param[in] User Points to user profile.
>- @param[in] ExpandSize The size of user profile.
>-
>- @retval TRUE Success to expand user profile size.
>- @retval FALSE Fail to expand user profile size.
>-
>-**/
>-BOOLEAN
>-ExpandUserProfile (
>- IN USER_PROFILE_ENTRY *User,
>- IN UINTN ExpandSize
>- )
>-{
>- UINT8 *Info;
>- UINTN InfoSizeInc;
>-
>- //
>- // Allocate new memory.
>- //
>- InfoSizeInc = 128;
>- User->MaxProfileSize += ((ExpandSize + InfoSizeInc - 1) / InfoSizeInc) *
>InfoSizeInc;
>- Info = AllocateZeroPool (User->MaxProfileSize);
>- if (Info == NULL) {
>- return FALSE;
>- }
>-
>- //
>- // Copy exist information.
>- //
>- if (User->UserProfileSize > 0) {
>- CopyMem (Info, User->ProfileInfo, User->UserProfileSize);
>- FreePool (User->ProfileInfo);
>- }
>-
>- User->ProfileInfo = Info;
>- return TRUE;
>-}
>-
>-
>-/**
>- Save the user profile to non-volatile memory, or delete it from non-volatile
>memory.
>-
>- @param[in] User Point to the user profile
>- @param[in] Delete If TRUE, delete the found user profile.
>- If FALSE, save the user profile.
>- @retval EFI_SUCCESS Save or delete user profile successfully.
>- @retval Others Fail to change the profile.
>-
>-**/
>-EFI_STATUS
>-SaveNvUserProfile (
>- IN USER_PROFILE_ENTRY *User,
>- IN BOOLEAN Delete
>- )
>-{
>- EFI_STATUS Status;
>-
>- //
>- // Check user profile entry.
>- //
>- Status = FindUserProfile (&User, FALSE, NULL);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Save the user profile to non-volatile memory.
>- //
>- Status = gRT->SetVariable (
>- User->UserVarName,
>- &gUserIdentifyManagerGuid,
>- EFI_VARIABLE_NON_VOLATILE |
>EFI_VARIABLE_BOOTSERVICE_ACCESS,
>- Delete ? 0 : User->UserProfileSize,
>- User->ProfileInfo
>- );
>- return Status;
>-}
>-
>-/**
>- Add one new user info into the user's profile.
>-
>- @param[in] User point to the user profile
>- @param[in] Info Points to the user information payload.
>- @param[in] InfoSize The size of the user information payload, in bytes.
>- @param[out] UserInfo Point to the new info in user profile
>- @param[in] Save If TRUE, save the profile to NV flash.
>- If FALSE, don't need to save the profile to NV flash.
>-
>- @retval EFI_SUCCESS Add user info to user profile successfully.
>- @retval Others Fail to add user info to user profile.
>-
>-**/
>-EFI_STATUS
>-AddUserInfo (
>- IN USER_PROFILE_ENTRY *User,
>- IN UINT8 *Info,
>- IN UINTN InfoSize,
>- OUT EFI_USER_INFO **UserInfo, OPTIONAL
>- IN BOOLEAN Save
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((Info == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check user profile handle.
>- //
>- Status = FindUserProfile (&User, FALSE, NULL);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Check user information memory size.
>- //
>- if (User->MaxProfileSize - User->UserProfileSize < ALIGN_VARIABLE
>(InfoSize)) {
>- if (!ExpandUserProfile (User, ALIGN_VARIABLE (InfoSize))) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- }
>-
>- //
>- // Add new user information.
>- //
>- CopyMem (User->ProfileInfo + User->UserProfileSize, Info, InfoSize);
>- if (UserInfo != NULL) {
>- *UserInfo = (EFI_USER_INFO *) (User->ProfileInfo + User-
>>UserProfileSize);
>- }
>- User->UserProfileSize += ALIGN_VARIABLE (InfoSize);
>-
>- //
>- // Save user profile information.
>- //
>- if (Save) {
>- Status = SaveNvUserProfile (User, FALSE);
>- }
>-
>- return Status;
>-}
>-
>-
>-/**
>- Get the user info from the specified user info handle.
>-
>- @param[in] User Point to the user profile.
>- @param[in] UserInfo Point to the user information record to get.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes.
>- On exit, holds the user information.
>- @param[in, out] InfoSize On entry, points to the size of Info.
>- On return, points to the size of the user information.
>- @param[in] ChkRight If TRUE, check the user info attribute.
>- If FALSE, don't check the user info attribute.
>-
>-
>- @retval EFI_ACCESS_DENIED The information cannot be accessed by the
>current user.
>- @retval EFI_INVALID_PARAMETER InfoSize is NULL or UserInfo is NULL.
>- @retval EFI_BUFFER_TOO_SMALL The number of bytes specified by
>*InfoSize is too small to hold the
>- returned data. The actual size required is returned in
>*InfoSize.
>- @retval EFI_SUCCESS Information returned successfully.
>-
>-**/
>-EFI_STATUS
>-GetUserInfo (
>- IN USER_PROFILE_ENTRY *User,
>- IN EFI_USER_INFO *UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize,
>- IN BOOLEAN ChkRight
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((InfoSize == NULL) || (UserInfo == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if ((*InfoSize != 0) && (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Find the user information to get.
>- //
>- Status = FindUserInfo (User, &UserInfo, FALSE, NULL);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Check information attributes.
>- //
>- if (ChkRight) {
>- switch (UserInfo->InfoAttribs & EFI_USER_INFO_ACCESS) {
>- case EFI_USER_INFO_PRIVATE:
>- case EFI_USER_INFO_PROTECTED:
>- if (User != mCurrentUser) {
>- return EFI_ACCESS_DENIED;
>- }
>- break;
>-
>- case EFI_USER_INFO_PUBLIC:
>- break;
>-
>- default:
>- return EFI_INVALID_PARAMETER;
>- break;
>- }
>- }
>-
>- //
>- // Get user information.
>- //
>- if (UserInfo->InfoSize > *InfoSize) {
>- *InfoSize = UserInfo->InfoSize;
>- return EFI_BUFFER_TOO_SMALL;
>- }
>-
>- *InfoSize = UserInfo->InfoSize;
>- if (Info != NULL) {
>- CopyMem (Info, UserInfo, *InfoSize);
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Delete the specified user information from user profile.
>-
>- @param[in] User Point to the user profile.
>- @param[in] Info Point to the user information record to delete.
>- @param[in] Save If TRUE, save the profile to NV flash.
>- If FALSE, don't need to save the profile to NV flash.
>-
>- @retval EFI_SUCCESS Delete user info from user profile successfully.
>- @retval Others Fail to delete user info from user profile.
>-
>-**/
>-EFI_STATUS
>-DelUserInfo (
>- IN USER_PROFILE_ENTRY *User,
>- IN EFI_USER_INFO *Info,
>- IN BOOLEAN Save
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Offset;
>- UINTN NextOffset;
>-
>- //
>- // Check user information handle.
>- //
>- Status = FindUserInfo (User, &Info, FALSE, &Offset);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- if (Info->InfoType == EFI_USER_INFO_IDENTIFIER_RECORD) {
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Delete the specified user information.
>- //
>- NextOffset = Offset + ALIGN_VARIABLE (Info->InfoSize);
>- User->UserProfileSize -= ALIGN_VARIABLE (Info->InfoSize);
>- if (Offset < User->UserProfileSize) {
>- CopyMem (User->ProfileInfo + Offset, User->ProfileInfo + NextOffset,
>User->UserProfileSize - Offset);
>- }
>-
>- if (Save) {
>- Status = SaveNvUserProfile (User, FALSE);
>- }
>-
>- return Status;
>-}
>-
>-
>-/**
>- Add or update user information.
>-
>- @param[in] User Point to the user profile.
>- @param[in, out] UserInfo On entry, points to the user information to
>modify,
>- or NULL to add a new UserInfo.
>- On return, points to the modified user information.
>- @param[in] Info Points to the new user information.
>- @param[in] InfoSize The size of Info,in bytes.
>-
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL or Info is NULL.
>- @retval EFI_ACCESS_DENIED The record is exclusive.
>- @retval EFI_SUCCESS User information was successfully
>changed/added.
>-
>-**/
>-EFI_STATUS
>-ModifyUserInfo (
>- IN USER_PROFILE_ENTRY *User,
>- IN OUT EFI_USER_INFO **UserInfo,
>- IN CONST EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- )
>-{
>- EFI_STATUS Status;
>- UINTN PayloadLen;
>- EFI_USER_INFO *OldInfo;
>-
>- if ((UserInfo == NULL) || (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (InfoSize < sizeof (EFI_USER_INFO) || InfoSize != Info->InfoSize) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check user information.
>- //
>- if (Info->InfoType == EFI_USER_INFO_IDENTIFIER_RECORD) {
>- return EFI_ACCESS_DENIED;
>- }
>-
>- if (!CheckUserInfo (Info)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>-
>- if (*UserInfo == NULL) {
>- //
>- // Add new user information.
>- //
>- OldInfo = NULL;
>- do {
>- Status = FindUserInfoByType (User, &OldInfo, Info->InfoType);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- ASSERT (OldInfo != NULL);
>-
>- if (((OldInfo->InfoAttribs & EFI_USER_INFO_EXCLUSIVE) != 0) ||
>- ((Info->InfoAttribs & EFI_USER_INFO_EXCLUSIVE) != 0)) {
>- //
>- // Same type can not co-exist for exclusive information.
>- //
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Check whether it exists in DB.
>- //
>- if (Info->InfoSize != OldInfo->InfoSize) {
>- continue;
>- }
>-
>- if (!CompareGuid (&OldInfo->Credential, &Info->Credential)) {
>- continue;
>- }
>-
>- PayloadLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- if (PayloadLen == 0) {
>- continue;
>- }
>-
>- if (CompareMem ((UINT8 *)(OldInfo + 1), (UINT8 *)(Info + 1),
>PayloadLen) != 0) {
>- continue;
>- }
>-
>- //
>- // Yes. The new info is as same as the one in profile.
>- //
>- return EFI_SUCCESS;
>- } while (!EFI_ERROR (Status));
>-
>- Status = AddUserInfo (User, (UINT8 *) Info, InfoSize, UserInfo, TRUE);
>- return Status;
>- }
>-
>- //
>- // Modify existing user information.
>- //
>- OldInfo = *UserInfo;
>- if (OldInfo->InfoType != Info->InfoType) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (((Info->InfoAttribs & EFI_USER_INFO_EXCLUSIVE) != 0) &&
>- (OldInfo->InfoAttribs & EFI_USER_INFO_EXCLUSIVE) == 0) {
>- //
>- // Try to add exclusive attrib in new info.
>- // Check whether there is another information with the same type in
>profile.
>- //
>- OldInfo = NULL;
>- do {
>- Status = FindUserInfoByType (User, &OldInfo, Info->InfoType);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- if (OldInfo != *UserInfo) {
>- //
>- // There is another information with the same type in profile.
>- // Therefore, can't modify existing user information to add exclusive
>attribute.
>- //
>- return EFI_ACCESS_DENIED;
>- }
>- } while (TRUE);
>- }
>-
>- Status = DelUserInfo (User, *UserInfo, FALSE);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- return AddUserInfo (User, (UINT8 *) Info, InfoSize, UserInfo, TRUE);
>-}
>-
>-
>-/**
>- Delete the user profile from non-volatile memory and database.
>-
>- @param[in] User Points to the user profile.
>-
>- @retval EFI_SUCCESS Delete user from the user profile successfully.
>- @retval Others Fail to delete user from user profile
>-
>-**/
>-EFI_STATUS
>-DelUserProfile (
>- IN USER_PROFILE_ENTRY *User
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>-
>- //
>- // Check whether it is in the user profile database.
>- //
>- Status = FindUserProfile (&User, FALSE, &Index);
>- if (EFI_ERROR (Status)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check whether it is the current user.
>- //
>- if (User == mCurrentUser) {
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Delete user profile from the non-volatile memory.
>- //
>- Status = SaveNvUserProfile (mUserProfileDb-
>>UserProfile[mUserProfileDb->UserProfileNum - 1], TRUE);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- mUserProfileDb->UserProfileNum--;
>-
>- //
>- // Modify user profile database.
>- //
>- if (Index != mUserProfileDb->UserProfileNum) {
>- mUserProfileDb->UserProfile[Index] = mUserProfileDb-
>>UserProfile[mUserProfileDb->UserProfileNum];
>- CopyMem (
>- ((USER_PROFILE_ENTRY *) mUserProfileDb->UserProfile[Index])-
>>UserVarName,
>- User->UserVarName,
>- sizeof (User->UserVarName)
>- );
>- Status = SaveNvUserProfile (mUserProfileDb->UserProfile[Index], FALSE);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- }
>- //
>- // Delete user profile information.
>- //
>- if (User->ProfileInfo != NULL) {
>- FreePool (User->ProfileInfo);
>- }
>-
>- FreePool (User);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Add user profile to user profile database.
>-
>- @param[out] UserProfile Point to the newly added user profile.
>- @param[in] ProfileSize The size of the user profile.
>- @param[in] ProfileInfo Point to the user profie data.
>- @param[in] Save If TRUE, save the new added profile to NV flash.
>- If FALSE, don't save the profile to NV flash.
>-
>- @retval EFI_SUCCESS Add user profile to user profile database
>successfully.
>- @retval Others Fail to add user profile to user profile database.
>-
>-**/
>-EFI_STATUS
>-AddUserProfile (
>- OUT USER_PROFILE_ENTRY **UserProfile, OPTIONAL
>- IN UINTN ProfileSize,
>- IN UINT8 *ProfileInfo,
>- IN BOOLEAN Save
>- )
>-{
>- EFI_STATUS Status;
>- USER_PROFILE_ENTRY *User;
>-
>- //
>- // Check the data format to be added.
>- //
>- if (!CheckProfileInfo (ProfileInfo, ProfileSize)) {
>- return EFI_SECURITY_VIOLATION;
>- }
>-
>- //
>- // Create user profile entry.
>- //
>- User = AllocateZeroPool (sizeof (USER_PROFILE_ENTRY));
>- if (User == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- //
>- // Add the entry to the user profile database.
>- //
>- if (mUserProfileDb->UserProfileNum == mUserProfileDb->MaxProfileNum)
>{
>- if (!ExpandUsermUserProfileDb ()) {
>- FreePool (User);
>- return EFI_OUT_OF_RESOURCES;
>- }
>- }
>-
>- UnicodeSPrint (
>- User->UserVarName,
>- sizeof (User->UserVarName),
>- L"User%04x",
>- mUserProfileDb->UserProfileNum
>- );
>- User->UserProfileSize = 0;
>- User->MaxProfileSize = 0;
>- User->ProfileInfo = NULL;
>- mUserProfileDb->UserProfile[mUserProfileDb->UserProfileNum] =
>(EFI_USER_PROFILE_HANDLE) User;
>- mUserProfileDb->UserProfileNum++;
>-
>- //
>- // Add user profile information.
>- //
>- Status = AddUserInfo (User, ProfileInfo, ProfileSize, NULL, Save);
>- if (EFI_ERROR (Status)) {
>- DelUserProfile (User);
>- return Status;
>- }
>- //
>- // Set new user profile handle.
>- //
>- if (UserProfile != NULL) {
>- *UserProfile = User;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- This function creates a new user profile with only a new user identifier
>- attached and returns its handle. The user profile is non-volatile, but the
>- handle User can change across reboots.
>-
>- @param[out] User Handle of a new user profile.
>-
>- @retval EFI_SUCCESS User profile was successfully created.
>- @retval Others Fail to create user profile
>-
>-**/
>-EFI_STATUS
>-CreateUserProfile (
>- OUT USER_PROFILE_ENTRY **User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>-
>- if (User == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- //
>- // Generate user id information.
>- //
>- UserInfo = AllocateZeroPool (sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_IDENTIFIER));
>- if (UserInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- UserInfo->InfoType = EFI_USER_INFO_IDENTIFIER_RECORD;
>- UserInfo->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_IDENTIFIER);
>- UserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- GenerateUserId ((UINT8 *) (UserInfo + 1));
>-
>- //
>- // Add user profile to the user profile database.
>- //
>- Status = AddUserProfile (User, UserInfo->InfoSize, (UINT8 *) UserInfo,
>TRUE);
>- FreePool (UserInfo);
>- return Status;
>-}
>-
>-
>-/**
>- Add a default user profile to user profile database.
>-
>- @retval EFI_SUCCESS A default user profile is added successfully.
>- @retval Others Fail to add a default user profile
>-
>-**/
>-EFI_STATUS
>-AddDefaultUserProfile (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- USER_PROFILE_ENTRY *User;
>- EFI_USER_INFO *Info;
>- EFI_USER_INFO *NewInfo;
>- EFI_USER_INFO_CREATE_DATE CreateDate;
>- EFI_USER_INFO_USAGE_COUNT UsageCount;
>- EFI_USER_INFO_ACCESS_CONTROL *Access;
>- EFI_USER_INFO_IDENTITY_POLICY *Policy;
>-
>- //
>- // Create a user profile.
>- //
>- Status = CreateUserProfile (&User);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Allocate a buffer to add all default user information.
>- //
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + INFO_PAYLOAD_SIZE);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- //
>- // Add user name.
>- //
>- Info->InfoType = EFI_USER_INFO_NAME_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof (mUserName);
>- CopyMem ((UINT8 *) (Info + 1), mUserName, sizeof (mUserName));
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- //
>- // Add user profile create date record.
>- //
>- Info->InfoType = EFI_USER_INFO_CREATE_DATE_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_CREATE_DATE);
>- Status = gRT->GetTime (&CreateDate, NULL);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- CopyMem ((UINT8 *) (Info + 1), &CreateDate, sizeof
>(EFI_USER_INFO_CREATE_DATE));
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- //
>- // Add user profile usage count record.
>- //
>- Info->InfoType = EFI_USER_INFO_USAGE_COUNT_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_USAGE_COUNT);
>- UsageCount = 0;
>- CopyMem ((UINT8 *) (Info + 1), &UsageCount, sizeof
>(EFI_USER_INFO_USAGE_COUNT));
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- //
>- // Add user access right.
>- //
>- Info->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Access = (EFI_USER_INFO_ACCESS_CONTROL *) (Info + 1);
>- Access->Type = EFI_USER_INFO_ACCESS_MANAGE;
>- Access->Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
>- Info->InfoSize = sizeof (EFI_USER_INFO) + Access->Size;
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- //
>- // Add user identity policy.
>- //
>- Info->InfoType = EFI_USER_INFO_IDENTITY_POLICY_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PRIVATE | EFI_USER_INFO_EXCLUSIVE;
>- Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (Info + 1);
>- Policy->Type = EFI_USER_INFO_IDENTITY_TRUE;
>- Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- Info->InfoSize = sizeof (EFI_USER_INFO) + Policy->Length;
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>-
>-Done:
>- FreePool (Info);
>- return Status;
>-}
>-
>-
>-/**
>- Publish current user information into EFI System Configuration Table.
>-
>- By UEFI spec, the User Identity Manager will publish the current user profile
>- into the EFI System Configuration Table. Currently, only the user identifier
>and user
>- name are published.
>-
>- @retval EFI_SUCCESS Current user information is published successfully.
>- @retval Others Fail to publish current user information
>-
>-**/
>-EFI_STATUS
>-PublishUserTable (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- EFI_CONFIGURATION_TABLE *EfiConfigurationTable;
>- EFI_USER_INFO_TABLE *UserInfoTable;
>- EFI_USER_INFO *IdInfo;
>- EFI_USER_INFO *NameInfo;
>-
>- Status = EfiGetSystemConfigurationTable (
>- &gEfiUserManagerProtocolGuid,
>- (VOID **) &EfiConfigurationTable
>- );
>- if (!EFI_ERROR (Status)) {
>- //
>- // The table existed!
>- //
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Get user ID information.
>- //
>- IdInfo = NULL;
>- Status = FindUserInfoByType (mCurrentUser, &IdInfo,
>EFI_USER_INFO_IDENTIFIER_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>-
>- }
>- //
>- // Get user name information.
>- //
>- NameInfo = NULL;
>- Status = FindUserInfoByType (mCurrentUser, &NameInfo,
>EFI_USER_INFO_NAME_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Allocate a buffer for user information table.
>- //
>- UserInfoTable = (EFI_USER_INFO_TABLE *) AllocateRuntimePool (
>- sizeof (EFI_USER_INFO_TABLE) +
>- IdInfo->InfoSize +
>- NameInfo->InfoSize
>- );
>- if (UserInfoTable == NULL) {
>- Status = EFI_OUT_OF_RESOURCES;
>- return Status;
>- }
>-
>- UserInfoTable->Size = sizeof (EFI_USER_INFO_TABLE);
>-
>- //
>- // Append the user information to the user info table
>- //
>- CopyMem ((UINT8 *) UserInfoTable + UserInfoTable->Size, (UINT8 *) IdInfo,
>IdInfo->InfoSize);
>- UserInfoTable->Size += IdInfo->InfoSize;
>-
>- CopyMem ((UINT8 *) UserInfoTable + UserInfoTable->Size, (UINT8 *)
>NameInfo, NameInfo->InfoSize);
>- UserInfoTable->Size += NameInfo->InfoSize;
>-
>- Status = gBS->InstallConfigurationTable (&gEfiUserManagerProtocolGuid,
>(VOID *) UserInfoTable);
>- return Status;
>-}
>-
>-
>-/**
>- Get the user's identity type.
>-
>- The identify manager only supports the identity policy in which the
>credential
>- provider handles are connected by the operator 'AND' or 'OR'.
>-
>-
>- @param[in] User Handle of a user profile.
>- @param[out] PolicyType Point to the identity type.
>-
>- @retval EFI_SUCCESS Get user's identity type successfully.
>- @retval Others Fail to get user's identity type.
>-
>-**/
>-EFI_STATUS
>-GetIdentifyType (
>- IN EFI_USER_PROFILE_HANDLE User,
>- OUT UINT8 *PolicyType
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *IdentifyInfo;
>- UINTN TotalLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>-
>- //
>- // Get user identify policy information.
>- //
>- IdentifyInfo = NULL;
>- Status = FindUserInfoByType (User, &IdentifyInfo,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- ASSERT (IdentifyInfo != NULL);
>-
>- //
>- // Search the user identify policy according to type.
>- //
>- TotalLen = 0;
>- *PolicyType = EFI_USER_INFO_IDENTITY_FALSE;
>- while (TotalLen < IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo +
>1) + TotalLen);
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_AND) {
>- *PolicyType = EFI_USER_INFO_IDENTITY_AND;
>- break;
>- }
>-
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_OR) {
>- *PolicyType = EFI_USER_INFO_IDENTITY_OR;
>- break;
>- }
>- TotalLen += Identity->Length;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Identify the User by the specfied provider.
>-
>- @param[in] User Handle of a user profile.
>- @param[in] Provider Points to the identifier of credential provider.
>-
>- @retval EFI_INVALID_PARAMETER Provider is NULL.
>- @retval EFI_NOT_FOUND Fail to identify the specified user.
>- @retval EFI_SUCCESS User is identified successfully.
>-
>-**/
>-EFI_STATUS
>-IdentifyByProviderId (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN EFI_GUID *Provider
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_IDENTIFIER UserId;
>- UINTN Index;
>- EFI_CREDENTIAL_LOGON_FLAGS AutoLogon;
>- EFI_HII_HANDLE HiiHandle;
>- EFI_GUID FormSetId;
>- EFI_FORM_ID FormId;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>-
>- if (Provider == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check the user ID identified by the specified credential provider.
>- //
>- for (Index = 0; Index < mProviderDb->Count; Index++) {
>- //
>- // Check credential provider class.
>- //
>- UserCredential = mProviderDb->Provider[Index];
>- if (CompareGuid (&UserCredential->Identifier, Provider)) {
>- Status = UserCredential->Select (UserCredential, &AutoLogon);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- if ((AutoLogon & EFI_CREDENTIAL_LOGON_FLAG_AUTO) == 0) {
>- //
>- // Get credential provider form.
>- //
>- Status = UserCredential->Form (
>- UserCredential,
>- &HiiHandle,
>- &FormSetId,
>- &FormId
>- );
>- if (!EFI_ERROR (Status)) {
>- //
>- // Send form to get user input.
>- //
>- Status = mCallbackInfo->FormBrowser2->SendForm (
>- mCallbackInfo->FormBrowser2,
>- &HiiHandle,
>- 1,
>- &FormSetId,
>- FormId,
>- NULL,
>- NULL
>- );
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- }
>- }
>-
>- Status = UserCredential->User (UserCredential, User, &UserId);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- Status = UserCredential->Deselect (UserCredential);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- return EFI_SUCCESS;
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Update user information when user is logon on successfully.
>-
>- @param[in] User Points to user profile.
>-
>- @retval EFI_SUCCESS Update user information successfully.
>- @retval Others Fail to update user information.
>-
>-**/
>-EFI_STATUS
>-UpdateUserInfo (
>- IN USER_PROFILE_ENTRY *User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *Info;
>- EFI_USER_INFO *NewInfo;
>- EFI_USER_INFO_CREATE_DATE Date;
>- EFI_USER_INFO_USAGE_COUNT UsageCount;
>- UINTN InfoLen;
>-
>- //
>- // Allocate a buffer to update user's date record and usage record.
>- //
>- InfoLen = MAX (sizeof (EFI_USER_INFO_CREATE_DATE), sizeof
>(EFI_USER_INFO_USAGE_COUNT));
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + InfoLen);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- //
>- // Check create date record.
>- //
>- NewInfo = NULL;
>- Status = FindUserInfoByType (User, &NewInfo,
>EFI_USER_INFO_CREATE_DATE_RECORD);
>- if (Status == EFI_NOT_FOUND) {
>- Info->InfoType = EFI_USER_INFO_CREATE_DATE_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_CREATE_DATE);
>- Status = gRT->GetTime (&Date, NULL);
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>-
>- CopyMem ((UINT8 *) (Info + 1), &Date, sizeof
>(EFI_USER_INFO_CREATE_DATE));
>- NewInfo = NULL;
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>- }
>-
>- //
>- // Update usage date record.
>- //
>- NewInfo = NULL;
>- Status = FindUserInfoByType (User, &NewInfo,
>EFI_USER_INFO_USAGE_DATE_RECORD);
>- if ((Status == EFI_SUCCESS) || (Status == EFI_NOT_FOUND)) {
>- Info->InfoType = EFI_USER_INFO_USAGE_DATE_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_USAGE_DATE);
>- Status = gRT->GetTime (&Date, NULL);
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>-
>- CopyMem ((UINT8 *) (Info + 1), &Date, sizeof
>(EFI_USER_INFO_USAGE_DATE));
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>- }
>-
>- //
>- // Update usage count record.
>- //
>- UsageCount = 0;
>- NewInfo = NULL;
>- Status = FindUserInfoByType (User, &NewInfo,
>EFI_USER_INFO_USAGE_COUNT_RECORD);
>- //
>- // Get usage count.
>- //
>- if (Status == EFI_SUCCESS) {
>- CopyMem (&UsageCount, (UINT8 *) (NewInfo + 1), sizeof
>(EFI_USER_INFO_USAGE_COUNT));
>- }
>-
>- UsageCount++;
>- if ((Status == EFI_SUCCESS) || (Status == EFI_NOT_FOUND)) {
>- Info->InfoType = EFI_USER_INFO_USAGE_COUNT_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_USAGE_COUNT);
>- CopyMem ((UINT8 *) (Info + 1), &UsageCount, sizeof
>(EFI_USER_INFO_USAGE_COUNT));
>- Status = ModifyUserInfo (User, &NewInfo, Info, Info->InfoSize);
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>- }
>-
>- FreePool (Info);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Add a credenetial provider item in form.
>-
>- @param[in] ProviderGuid Points to the identifir of credential provider.
>- @param[in] OpCodeHandle Points to container for dynamic created
>opcodes.
>-
>-**/
>-VOID
>-AddProviderSelection (
>- IN EFI_GUID *ProviderGuid,
>- IN VOID *OpCodeHandle
>- )
>-{
>- EFI_HII_HANDLE HiiHandle;
>- EFI_STRING_ID ProvID;
>- CHAR16 *ProvStr;
>- UINTN Index;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>-
>- for (Index = 0; Index < mProviderDb->Count; Index++) {
>- UserCredential = mProviderDb->Provider[Index];
>- if (CompareGuid (&UserCredential->Identifier, ProviderGuid)) {
>- //
>- // Add credential provider selection.
>- //
>- UserCredential->Title (UserCredential, &HiiHandle, &ProvID);
>- ProvStr = HiiGetString (HiiHandle, ProvID, NULL);
>- if (ProvStr == NULL) {
>- continue ;
>- }
>- ProvID = HiiSetString (mCallbackInfo->HiiHandle, 0, ProvStr, NULL);
>- FreePool (ProvStr);
>- HiiCreateActionOpCode (
>- OpCodeHandle, // Container for dynamic created opcodes
>- (EFI_QUESTION_ID)(LABEL_PROVIDER_NAME + Index), // Question ID
>- ProvID, // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- 0 // Action String ID
>- );
>- break;
>- }
>- }
>-}
>-
>-
>-/**
>- Add a username item in form.
>-
>- @param[in] Index The index of the user in the user name list.
>- @param[in] User Points to the user profile whose username is added.
>- @param[in] OpCodeHandle Points to container for dynamic created
>opcodes.
>-
>- @retval EFI_SUCCESS Add a username successfully.
>- @retval Others Fail to add a username.
>-
>-**/
>-EFI_STATUS
>-AddUserSelection (
>- IN UINT16 Index,
>- IN USER_PROFILE_ENTRY *User,
>- IN VOID *OpCodeHandle
>- )
>-{
>- EFI_STRING_ID UserName;
>- EFI_STATUS Status;
>- EFI_USER_INFO *UserInfo;
>-
>- UserInfo = NULL;
>- Status = FindUserInfoByType (User, &UserInfo,
>EFI_USER_INFO_NAME_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Add user name selection.
>- //
>- UserName = HiiSetString (mCallbackInfo->HiiHandle, 0, (EFI_STRING)
>(UserInfo + 1), NULL);
>- if (UserName == 0) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- HiiCreateGotoOpCode (
>- OpCodeHandle, // Container for dynamic created opcodes
>- FORMID_PROVIDER_FORM, // Target Form ID
>- UserName, // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- (UINT16) Index // Question ID
>- );
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Identify the user whose identity policy does not contain the operator 'OR'.
>-
>- @param[in] User Points to the user profile.
>-
>- @retval EFI_SUCCESS The specified user is identified successfully.
>- @retval Others Fail to identify the user.
>-
>-**/
>-EFI_STATUS
>-IdentifyAndTypeUser (
>- IN USER_PROFILE_ENTRY *User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *IdentifyInfo;
>- BOOLEAN Success;
>- UINTN TotalLen;
>- UINTN ValueLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>-
>- //
>- // Get user identify policy information.
>- //
>- IdentifyInfo = NULL;
>- Status = FindUserInfoByType (User, &IdentifyInfo,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- ASSERT (IdentifyInfo != NULL);
>-
>- //
>- // Check each part of identification policy expression.
>- //
>- Success = FALSE;
>- TotalLen = 0;
>- while (TotalLen < IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo +
>1) + TotalLen);
>- ValueLen = Identity->Length - sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- switch (Identity->Type) {
>-
>- case EFI_USER_INFO_IDENTITY_FALSE:
>- //
>- // Check False option.
>- //
>- Success = FALSE;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_TRUE:
>- //
>- // Check True option.
>- //
>- Success = TRUE;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_NOT:
>- //
>- // Check negative operation.
>- //
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_AND:
>- //
>- // Check and operation.
>- //
>- if (!Success) {
>- return EFI_NOT_READY;
>- }
>-
>- Success = FALSE;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_OR:
>- //
>- // Check or operation.
>- //
>- if (Success) {
>- return EFI_SUCCESS;
>- }
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:
>- //
>- // Check credential provider by type.
>- //
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
>- //
>- // Check credential provider by ID.
>- //
>- if (ValueLen != sizeof (EFI_GUID)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- Status = IdentifyByProviderId (User, (EFI_GUID *) (Identity + 1));
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- Success = TRUE;
>- break;
>-
>- default:
>- return EFI_INVALID_PARAMETER;
>- break;
>- }
>-
>- TotalLen += Identity->Length;
>- }
>-
>- if (TotalLen != IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (!Success) {
>- return EFI_NOT_READY;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Identify the user whose identity policy does not contain the operator 'AND'.
>-
>- @param[in] User Points to the user profile.
>-
>- @retval EFI_SUCCESS The specified user is identified successfully.
>- @retval Others Fail to identify the user.
>-
>-**/
>-EFI_STATUS
>-IdentifyOrTypeUser (
>- IN USER_PROFILE_ENTRY *User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *IdentifyInfo;
>- UINTN TotalLen;
>- UINTN ValueLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Get user identify policy information.
>- //
>- IdentifyInfo = NULL;
>- Status = FindUserInfoByType (User, &IdentifyInfo,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- ASSERT (IdentifyInfo != NULL);
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_PROVIDER_NAME;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add the providers that exists in the user's policy.
>- //
>- TotalLen = 0;
>- while (TotalLen < IdentifyInfo->InfoSize - sizeof (EFI_USER_INFO)) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo +
>1) + TotalLen);
>- ValueLen = Identity->Length - sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {
>- AddProviderSelection ((EFI_GUID *) (Identity + 1), StartOpCodeHandle);
>- }
>-
>- TotalLen += Identity->Length;
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserIdentifyManagerGuid,// Formset GUID
>- FORMID_PROVIDER_FORM, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- This function processes the results of changes in configuration.
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Action Specifies the type of action taken by the browser.
>- @param QuestionId A unique value which is sent to the original
>- exporting driver so that it can identify the type
>- of data to expect.
>- @param Type The type of value for the question.
>- @param Value A pointer to the data being sent to the original
>- exporting driver.
>- @param ActionRequest On return, points to the action requested by
>the
>- callback function.
>-
>- @retval EFI_SUCCESS The callback successfully handled the action.
>- @retval Others Fail to handle the action.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserIdentifyManagerCallback (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN EFI_BROWSER_ACTION Action,
>- IN EFI_QUESTION_ID QuestionId,
>- IN UINT8 Type,
>- IN EFI_IFR_TYPE_VALUE *Value,
>- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
>- )
>-{
>- EFI_STATUS Status;
>- USER_PROFILE_ENTRY *User;
>- UINT8 PolicyType;
>- UINT16 Index;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- Status = EFI_SUCCESS;
>-
>- switch (Action) {
>- case EFI_BROWSER_ACTION_FORM_OPEN:
>- {
>- //
>- // Update user Form when user Form is opened.
>- // This will be done only in FORM_OPEN CallBack of question with
>FORM_OPEN_QUESTION_ID from user Form.
>- //
>- if (QuestionId != FORM_OPEN_QUESTION_ID) {
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_USER_NAME;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add all the user profile in the user profile database.
>- //
>- for (Index = 0; Index < mUserProfileDb->UserProfileNum; Index++) {
>- User = (USER_PROFILE_ENTRY *) mUserProfileDb->UserProfile[Index];
>- AddUserSelection ((UINT16)(LABEL_USER_NAME + Index), User,
>StartOpCodeHandle);
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserIdentifyManagerGuid,// Formset GUID
>- FORMID_USER_FORM, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-
>- return EFI_SUCCESS;
>- }
>- break;
>-
>- case EFI_BROWSER_ACTION_FORM_CLOSE:
>- Status = EFI_SUCCESS;
>- break;
>-
>- case EFI_BROWSER_ACTION_CHANGED:
>- if (QuestionId >= LABEL_PROVIDER_NAME) {
>- //
>- // QuestionId comes from the second Form (Select a Credential Provider if
>identity
>- // policy is OR type). Identify the user by the selected provider.
>- //
>- Status = IdentifyByProviderId (mCurrentUser, &mProviderDb-
>>Provider[QuestionId & 0xFFF]->Identifier);
>- if (Status == EFI_SUCCESS) {
>- mIdentified = TRUE;
>- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
>- }
>- return EFI_SUCCESS;
>- }
>- break;
>-
>- case EFI_BROWSER_ACTION_CHANGING:
>- //
>- // QuestionId comes from the first Form (Select a user to identify).
>- //
>- if (QuestionId >= LABEL_PROVIDER_NAME) {
>- return EFI_SUCCESS;
>- }
>-
>- User = (USER_PROFILE_ENTRY *) mUserProfileDb-
>>UserProfile[QuestionId & 0xFFF];
>- Status = GetIdentifyType (User, &PolicyType);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- if (PolicyType == EFI_USER_INFO_IDENTITY_OR) {
>- //
>- // Identify the user by "OR" logical.
>- //
>- Status = IdentifyOrTypeUser (User);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- mCurrentUser = (EFI_USER_PROFILE_HANDLE) User;
>- } else {
>- //
>- // Identify the user by "AND" logical.
>- //
>- Status = IdentifyAndTypeUser (User);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- mCurrentUser = (EFI_USER_PROFILE_HANDLE) User;
>- mIdentified = TRUE;
>- if (Type == EFI_IFR_TYPE_REF) {
>- Value->ref.FormId = FORMID_INVALID_FORM;
>- }
>- }
>- break;
>-
>- default:
>- //
>- // All other action return unsupported.
>- //
>- Status = EFI_UNSUPPORTED;
>- break;
>- }
>-
>-
>- return Status;
>-}
>-
>-
>-/**
>- This function construct user profile database from user data saved in the
>Flash.
>- If no user is found in Flash, add one default user "administrator" in the user
>- profile database.
>-
>- @retval EFI_SUCCESS Init user profile database successfully.
>- @retval Others Fail to init user profile database.
>-
>-**/
>-EFI_STATUS
>-InitUserProfileDb (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 *VarData;
>- UINTN VarSize;
>- UINTN CurVarSize;
>- CHAR16 VarName[10];
>- UINTN Index;
>- UINT32 VarAttr;
>-
>- if (mUserProfileDb != NULL) {
>- //
>- // The user profiles had been already initialized.
>- //
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Init user profile database structure.
>- //
>- if (!ExpandUsermUserProfileDb ()) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- CurVarSize = DEFAULT_PROFILE_SIZE;
>- VarData = AllocateZeroPool (CurVarSize);
>- if (VarData == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- //
>- // Get all user proifle entries.
>- //
>- Index = 0;
>- while (TRUE) {
>- //
>- // Get variable name.
>- //
>- UnicodeSPrint (
>- VarName,
>- sizeof (VarName),
>- L"User%04x",
>- Index
>- );
>- Index++;
>-
>- //
>- // Get variable value.
>- //
>- VarSize = CurVarSize;
>- Status = gRT->GetVariable (VarName, &gUserIdentifyManagerGuid,
>&VarAttr, &VarSize, VarData);
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- FreePool (VarData);
>- VarData = AllocatePool (VarSize);
>- if (VarData == NULL) {
>- Status = EFI_OUT_OF_RESOURCES;
>- break;
>- }
>-
>- CurVarSize = VarSize;
>- Status = gRT->GetVariable (VarName, &gUserIdentifyManagerGuid,
>&VarAttr, &VarSize, VarData);
>- }
>-
>- if (EFI_ERROR (Status)) {
>- if (Status == EFI_NOT_FOUND) {
>- Status = EFI_SUCCESS;
>- }
>- break;
>- }
>-
>- //
>- // Check variable attributes.
>- //
>- if (VarAttr != (EFI_VARIABLE_NON_VOLATILE |
>EFI_VARIABLE_BOOTSERVICE_ACCESS)) {
>- Status = gRT->SetVariable (VarName, &gUserIdentifyManagerGuid,
>VarAttr, 0, NULL);
>- continue;
>- }
>-
>- //
>- // Add user profile to the user profile database.
>- //
>- Status = AddUserProfile (NULL, VarSize, VarData, FALSE);
>- if (EFI_ERROR (Status)) {
>- if (Status == EFI_SECURITY_VIOLATION) {
>- //
>- // Delete invalid user profile
>- //
>- gRT->SetVariable (VarName, &gUserIdentifyManagerGuid, VarAttr, 0,
>NULL);
>- } else if (Status == EFI_OUT_OF_RESOURCES) {
>- break;
>- }
>- } else {
>- //
>- // Delete and save the profile again if some invalid profiles are deleted.
>- //
>- if (mUserProfileDb->UserProfileNum < Index) {
>- gRT->SetVariable (VarName, &gUserIdentifyManagerGuid, VarAttr, 0,
>NULL);
>- SaveNvUserProfile (mUserProfileDb->UserProfile[mUserProfileDb-
>>UserProfileNum - 1], FALSE);
>- }
>- }
>- }
>-
>- if (VarData != NULL) {
>- FreePool (VarData);
>- }
>-
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Check whether the user profile database is empty.
>- //
>- if (mUserProfileDb->UserProfileNum == 0) {
>- Status = AddDefaultUserProfile ();
>- }
>-
>- return Status;
>-}
>-
>-
>-/**
>- This function collects all the credential providers and saves to mProviderDb.
>-
>- @retval EFI_SUCCESS Collect credential providers successfully.
>- @retval Others Fail to collect credential providers.
>-
>-**/
>-EFI_STATUS
>-InitProviderInfo (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINTN HandleCount;
>- EFI_HANDLE *HandleBuf;
>- UINTN Index;
>-
>- if (mProviderDb != NULL) {
>- //
>- // The credential providers had been collected before.
>- //
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Try to find all the user credential provider driver.
>- //
>- HandleCount = 0;
>- HandleBuf = NULL;
>- Status = gBS->LocateHandleBuffer (
>- ByProtocol,
>- &gEfiUserCredential2ProtocolGuid,
>- NULL,
>- &HandleCount,
>- &HandleBuf
>- );
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Get provider infomation.
>- //
>- mProviderDb = AllocateZeroPool (
>- sizeof (CREDENTIAL_PROVIDER_INFO) -
>- sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *) +
>- HandleCount * sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *)
>- );
>- if (mProviderDb == NULL) {
>- FreePool (HandleBuf);
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- mProviderDb->Count = HandleCount;
>- for (Index = 0; Index < HandleCount; Index++) {
>- Status = gBS->HandleProtocol (
>- HandleBuf[Index],
>- &gEfiUserCredential2ProtocolGuid,
>- (VOID **) &mProviderDb->Provider[Index]
>- );
>- if (EFI_ERROR (Status)) {
>- FreePool (HandleBuf);
>- FreePool (mProviderDb);
>- mProviderDb = NULL;
>- return Status;
>- }
>- }
>-
>- FreePool (HandleBuf);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- This function allows a caller to extract the current configuration for one
>- or more named elements from the target driver.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Request A null-terminated Unicode string in <ConfigRequest>
>format.
>- @param Progress On return, points to a character in the Request string.
>- Points to the string's null terminator if request was successful.
>- Points to the most recent '&' before the first failing name/value
>- pair (or the beginning of the string if the failure is in the
>- first name/value pair) if the request was not successful.
>- @param Results A null-terminated Unicode string in <ConfigAltResp>
>format which
>- has all values filled in for the names in the Request string.
>- String to be allocated by the called function.
>-
>- @retval EFI_SUCCESS The Results is filled with the requested values.
>- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
>results.
>- @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown
>name.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeExtractConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Request,
>- OUT EFI_STRING *Progress,
>- OUT EFI_STRING *Results
>- )
>-{
>- if (Progress == NULL || Results == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- *Progress = Request;
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- This function processes the results of changes in configuration.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Configuration A null-terminated Unicode string in <ConfigResp>
>format.
>- @param Progress A pointer to a string filled in with the offset of the
>most
>- recent '&' before the first failing name/value pair (or the
>- beginning of the string if the failure is in the first
>- name/value pair) or the terminating NULL if all was successful.
>-
>- @retval EFI_SUCCESS The Results is processed successfully.
>- @retval EFI_INVALID_PARAMETER Configuration is NULL.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeRouteConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Configuration,
>- OUT EFI_STRING *Progress
>- )
>-{
>- if (Configuration == NULL || Progress == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *Progress = Configuration;
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- This function initialize the data mainly used in form browser.
>-
>- @retval EFI_SUCCESS Initialize form data successfully.
>- @retval Others Fail to Initialize form data.
>-
>-**/
>-EFI_STATUS
>-InitFormBrowser (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- USER_MANAGER_CALLBACK_INFO *CallbackInfo;
>- EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
>- EFI_HII_STRING_PROTOCOL *HiiString;
>- EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
>-
>- //
>- // Initialize driver private data.
>- //
>- CallbackInfo = AllocateZeroPool (sizeof
>(USER_MANAGER_CALLBACK_INFO));
>- if (CallbackInfo == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- CallbackInfo->Signature = USER_MANAGER_SIGNATURE;
>- CallbackInfo->ConfigAccess.ExtractConfig = FakeExtractConfig;
>- CallbackInfo->ConfigAccess.RouteConfig = FakeRouteConfig;
>- CallbackInfo->ConfigAccess.Callback = UserIdentifyManagerCallback;
>-
>- //
>- // Locate Hii Database protocol.
>- //
>- Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID
>**) &HiiDatabase);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- CallbackInfo->HiiDatabase = HiiDatabase;
>-
>- //
>- // Locate HiiString protocol.
>- //
>- Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **)
>&HiiString);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- CallbackInfo->HiiString = HiiString;
>-
>- //
>- // Locate Formbrowser2 protocol.
>- //
>- Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL,
>(VOID **) &FormBrowser2);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- CallbackInfo->FormBrowser2 = FormBrowser2;
>- CallbackInfo->DriverHandle = NULL;
>-
>- //
>- // Install Device Path Protocol and Config Access protocol to driver handle.
>- //
>- Status = gBS->InstallMultipleProtocolInterfaces (
>- &CallbackInfo->DriverHandle,
>- &gEfiDevicePathProtocolGuid,
>- &mHiiVendorDevicePath,
>- &gEfiHiiConfigAccessProtocolGuid,
>- &CallbackInfo->ConfigAccess,
>- NULL
>- );
>- ASSERT_EFI_ERROR (Status);
>-
>- //
>- // Publish HII data.
>- //
>- CallbackInfo->HiiHandle = HiiAddPackages (
>- &gUserIdentifyManagerGuid,
>- CallbackInfo->DriverHandle,
>- UserIdentifyManagerStrings,
>- UserIdentifyManagerVfrBin,
>- NULL
>- );
>- if (CallbackInfo->HiiHandle == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- mCallbackInfo = CallbackInfo;
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Identify the user whose identification policy supports auto logon.
>-
>- @param[in] ProviderIndex The provider index in the provider list.
>- @param[out] User Points to user user profile if a user is identified
>successfully.
>-
>- @retval EFI_SUCCESS Identify a user with the specified provider
>successfully.
>- @retval Others Fail to identify a user.
>-
>-**/
>-EFI_STATUS
>-IdentifyAutoLogonUser (
>- IN UINTN ProviderIndex,
>- OUT USER_PROFILE_ENTRY **User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *Info;
>- UINT8 PolicyType;
>-
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_IDENTIFIER));
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- Info->InfoType = EFI_USER_INFO_IDENTIFIER_RECORD;
>- Info->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_IDENTIFIER);
>-
>- //
>- // Identify the specified credential provider's auto logon user.
>- //
>- Status = mProviderDb->Provider[ProviderIndex]->User (
>- mProviderDb->Provider[ProviderIndex],
>- NULL,
>- (EFI_USER_INFO_IDENTIFIER *) (Info + 1)
>- );
>- if (EFI_ERROR (Status)) {
>- FreePool (Info);
>- return Status;
>- }
>-
>- //
>- // Find user with the specified user ID.
>- //
>- *User = NULL;
>- Status = FindUserProfileByInfo (User, NULL, Info, Info->InfoSize);
>- FreePool (Info);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- Status = GetIdentifyType ((EFI_USER_PROFILE_HANDLE) * User,
>&PolicyType);
>- if (PolicyType == EFI_USER_INFO_IDENTITY_AND) {
>- //
>- // The identified user need also identified by other credential provider.
>- // This can handle through select user.
>- //
>- return EFI_NOT_READY;
>- }
>-
>- return Status;
>-}
>-
>-
>-/**
>- Check whether the given console is ready.
>-
>- @param[in] ProtocolGuid Points to the protocol guid of sonsole .
>-
>- @retval TRUE The given console is ready.
>- @retval FALSE The given console is not ready.
>-
>-**/
>-BOOLEAN
>-CheckConsole (
>- EFI_GUID *ProtocolGuid
>- )
>-{
>- EFI_STATUS Status;
>- UINTN HandleCount;
>- EFI_HANDLE *HandleBuf;
>- UINTN Index;
>- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
>-
>- //
>- // Try to find all the handle driver.
>- //
>- HandleCount = 0;
>- HandleBuf = NULL;
>- Status = gBS->LocateHandleBuffer (
>- ByProtocol,
>- ProtocolGuid,
>- NULL,
>- &HandleCount,
>- &HandleBuf
>- );
>- if (EFI_ERROR (Status)) {
>- return FALSE;
>- }
>-
>- for (Index = 0; Index < HandleCount; Index++) {
>- DevicePath = DevicePathFromHandle (HandleBuf[Index]);
>- if (DevicePath != NULL) {
>- FreePool (HandleBuf);
>- return TRUE;
>- }
>- }
>- FreePool (HandleBuf);
>- return FALSE;
>-}
>-
>-
>-/**
>- Check whether the console is ready.
>-
>- @retval TRUE The console is ready.
>- @retval FALSE The console is not ready.
>-
>-**/
>-BOOLEAN
>-IsConsoleReady (
>- VOID
>- )
>-{
>- if (!CheckConsole (&gEfiSimpleTextOutProtocolGuid)) {
>- return FALSE;
>- }
>-
>- if (!CheckConsole (&gEfiSimpleTextInProtocolGuid)) {
>- if (!CheckConsole (&gEfiSimpleTextInputExProtocolGuid)) {
>- return FALSE;
>- }
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Identify a user to logon.
>-
>- @param[out] User Points to user user profile if a user is identified
>successfully.
>-
>- @retval EFI_SUCCESS Identify a user successfully.
>-
>-**/
>-EFI_STATUS
>-IdentifyUser (
>- OUT USER_PROFILE_ENTRY **User
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Index;
>- EFI_CREDENTIAL_LOGON_FLAGS AutoLogon;
>- EFI_USER_INFO *IdentifyInfo;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>- USER_PROFILE_ENTRY *UserEntry;
>-
>- //
>- // Initialize credential providers.
>- //
>- InitProviderInfo ();
>-
>- //
>- // Initialize user profile database.
>- //
>- InitUserProfileDb ();
>-
>- //
>- // If only one user in system, and its identify policy is TRUE, then auto logon.
>- //
>- if (mUserProfileDb->UserProfileNum == 1) {
>- UserEntry = (USER_PROFILE_ENTRY *) mUserProfileDb->UserProfile[0];
>- IdentifyInfo = NULL;
>- Status = FindUserInfoByType (UserEntry, &IdentifyInfo,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD);
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>- ASSERT (IdentifyInfo != NULL);
>-
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) ((UINT8 *) (IdentifyInfo +
>1));
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_TRUE) {
>- mCurrentUser = (EFI_USER_PROFILE_HANDLE) UserEntry;
>- UpdateUserInfo (UserEntry);
>- *User = UserEntry;
>- return EFI_SUCCESS;
>- }
>- }
>-
>- //
>- // Find and login the default & AutoLogon user.
>- //
>- for (Index = 0; Index < mProviderDb->Count; Index++) {
>- UserCredential = mProviderDb->Provider[Index];
>- Status = UserCredential->Default (UserCredential, &AutoLogon);
>- if (EFI_ERROR (Status)) {
>- continue;
>- }
>-
>- if ((AutoLogon & (EFI_CREDENTIAL_LOGON_FLAG_DEFAULT |
>EFI_CREDENTIAL_LOGON_FLAG_AUTO)) != 0) {
>- Status = IdentifyAutoLogonUser (Index, &UserEntry);
>- if (Status == EFI_SUCCESS) {
>- mCurrentUser = (EFI_USER_PROFILE_HANDLE) UserEntry;
>- UpdateUserInfo (UserEntry);
>- *User = UserEntry;
>- return EFI_SUCCESS;
>- }
>- }
>- }
>-
>- if (!IsConsoleReady ()) {
>- //
>- // The console is still not ready for user selection.
>- //
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Select a user and identify it.
>- //
>- mCallbackInfo->FormBrowser2->SendForm (
>- mCallbackInfo->FormBrowser2,
>- &mCallbackInfo->HiiHandle,
>- 1,
>- &gUserIdentifyManagerGuid,
>- 0,
>- NULL,
>- NULL
>- );
>-
>- if (mIdentified) {
>- *User = (USER_PROFILE_ENTRY *) mCurrentUser;
>- UpdateUserInfo (*User);
>- return EFI_SUCCESS;
>- }
>-
>- return EFI_ACCESS_DENIED;
>-}
>-
>-
>-/**
>- An empty function to pass error checking of CreateEventEx ().
>-
>- @param Event Event whose notification function is being invoked.
>- @param Context Pointer to the notification function's context,
>- which is implementation-dependent.
>-
>-**/
>-VOID
>-EFIAPI
>-InternalEmptyFuntion (
>- IN EFI_EVENT Event,
>- IN VOID *Context
>- )
>-{
>-}
>-
>-
>-/**
>- Create, Signal, and Close the User Profile Changed event.
>-
>-**/
>-VOID
>-SignalEventUserProfileChanged (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- EFI_EVENT Event;
>-
>- Status = gBS->CreateEventEx (
>- EVT_NOTIFY_SIGNAL,
>- TPL_CALLBACK,
>- InternalEmptyFuntion,
>- NULL,
>- &gEfiEventUserProfileChangedGuid,
>- &Event
>- );
>- ASSERT_EFI_ERROR (Status);
>- gBS->SignalEvent (Event);
>- gBS->CloseEvent (Event);
>-}
>-
>-
>-/**
>- Create a new user profile.
>-
>- This function creates a new user profile with only a new user identifier
>attached and returns
>- its handle. The user profile is non-volatile, but the handle User can change
>across reboots.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[out] User On return, points to the new user profile handle.
>- The user profile handle is unique only during this boot.
>-
>- @retval EFI_SUCCESS User profile was successfully created.
>- @retval EFI_ACCESS_DENIED Current user does not have sufficient
>permissions to create a
>- user profile.
>- @retval EFI_UNSUPPORTED Creation of new user profiles is not
>supported.
>- @retval EFI_INVALID_PARAMETER The User parameter is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileCreate (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *User
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check the right of the current user.
>- //
>- if (!CheckCurrentUserAccessRight (EFI_USER_INFO_ACCESS_MANAGE)) {
>- if (!CheckCurrentUserAccessRight
>(EFI_USER_INFO_ACCESS_ENROLL_OTHERS)) {
>- return EFI_ACCESS_DENIED;
>- }
>- }
>-
>- //
>- // Create new user profile
>- //
>- Status = CreateUserProfile ((USER_PROFILE_ENTRY **) User);
>- if (EFI_ERROR (Status)) {
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Delete an existing user profile.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] User User profile handle.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user does not have sufficient
>permissions to delete a user
>- profile or there is only one user profile.
>- @retval EFI_UNSUPPORTED Deletion of new user profiles is not
>supported.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileDelete (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>-
>- if (This == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check the right of the current user.
>- //
>- if (!CheckCurrentUserAccessRight (EFI_USER_INFO_ACCESS_MANAGE)) {
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Delete user profile.
>- //
>- Status = DelUserProfile (User);
>- if (EFI_ERROR (Status)) {
>- if (Status != EFI_INVALID_PARAMETER) {
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Enumerate all of the enrolled users on the platform.
>-
>- This function returns the next enrolled user profile. To retrieve the first user
>profile handle,
>- point User at a NULL. Each subsequent call will retrieve another user profile
>handle until there
>- are no more, at which point User will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in, out] User On entry, points to the previous user profile
>handle or NULL to
>- start enumeration. On exit, points to the next user profile
>handle
>- or NULL if there are no more user profiles.
>-
>- @retval EFI_SUCCESS Next enrolled user profile successfully returned.
>- @retval EFI_ACCESS_DENIED Next enrolled user profile was not
>successfully returned.
>- @retval EFI_INVALID_PARAMETER The User parameter is NULL.
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetNext (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN OUT EFI_USER_PROFILE_HANDLE *User
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- Status = FindUserProfile ((USER_PROFILE_ENTRY **) User, TRUE, NULL);
>- if (EFI_ERROR (Status)) {
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return the current user profile handle.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[out] CurrentUser On return, points to the current user profile
>handle.
>-
>- @retval EFI_SUCCESS Current user profile handle returned successfully.
>- @retval EFI_INVALID_PARAMETER The CurrentUser parameter is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileCurrent (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *CurrentUser
>- )
>-{
>- //
>- // Get current user profile.
>- //
>- if ((This == NULL) || (CurrentUser == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *CurrentUser = mCurrentUser;
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Identify a user.
>-
>- Identify the user and, if authenticated, returns the user handle and changes
>the current
>- user profile. All user information marked as private in a previously selected
>profile
>- is no longer available for inspection.
>- Whenever the current user profile is changed then the an event with the
>GUID
>- EFI_EVENT_GROUP_USER_PROFILE_CHANGED is signaled.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[out] User On return, points to the user profile handle for
>the current
>- user profile.
>-
>- @retval EFI_SUCCESS User was successfully identified.
>- @retval EFI_ACCESS_DENIED User was not successfully identified.
>- @retval EFI_INVALID_PARAMETER The User parameter is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileIdentify (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *User
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((This == NULL) || (User == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (mCurrentUser != NULL) {
>- *User = mCurrentUser;
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Identify user
>- //
>- Status = IdentifyUser ((USER_PROFILE_ENTRY **) User);
>- if (EFI_ERROR (Status)) {
>- return EFI_ACCESS_DENIED;
>- }
>-
>- //
>- // Publish the user info into the EFI system configuration table.
>- //
>- PublishUserTable ();
>-
>- //
>- // Signal User Profile Changed event.
>- //
>- SignalEventUserProfileChanged ();
>- return EFI_SUCCESS;
>-}
>-
>-/**
>- Find a user using a user information record.
>-
>- This function searches all user profiles for the specified user information
>record.
>- The search starts with the user information record handle following
>UserInfo and
>- continues until either the information is found or there are no more user
>profiles.
>- A match occurs when the Info.InfoType field matches the user information
>record
>- type and the user information record data matches the portion of Info.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in, out] User On entry, points to the previously returned user
>profile
>- handle, or NULL to start searching with the first user profile.
>- On return, points to the user profile handle, or NULL if not
>- found.
>- @param[in, out] UserInfo On entry, points to the previously returned
>user information
>- handle, or NULL to start searching with the first. On return,
>- points to the user information handle of the user
>information
>- record, or NULL if not found. Can be NULL, in which case only
>- one user information record per user can be returned.
>- @param[in] Info Points to the buffer containing the user information
>to be
>- compared to the user information record. If the user
>information
>- record data is empty, then only the user information record
>type
>- is compared. If InfoSize is 0, then the user information record
>- must be empty.
>-
>- @param[in] InfoSize The size of Info, in bytes.
>-
>- @retval EFI_SUCCESS User information was found. User points to the
>user profile
>- handle, and UserInfo points to the user information handle.
>- @retval EFI_NOT_FOUND User information was not found. User points
>to NULL, and
>- UserInfo points to NULL.
>- @retval EFI_INVALID_PARAMETER User is NULL. Or Info is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileFind (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN OUT EFI_USER_PROFILE_HANDLE *User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo OPTIONAL,
>- IN CONST EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- )
>-{
>- EFI_STATUS Status;
>- UINTN Size;
>-
>- if ((This == NULL) || (User == NULL) || (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if (InfoSize == 0) {
>- //
>- // If InfoSize is 0, then the user information record must be empty.
>- //
>- if (Info->InfoSize != sizeof (EFI_USER_INFO)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- } else {
>- if (InfoSize != Info->InfoSize) {
>- return EFI_INVALID_PARAMETER;
>- }
>- }
>- Size = Info->InfoSize;
>-
>- //
>- // Find user profile accdoring to user information.
>- //
>- Status = FindUserProfileByInfo (
>- (USER_PROFILE_ENTRY **) User,
>- (EFI_USER_INFO **) UserInfo,
>- (EFI_USER_INFO *) Info,
>- Size
>- );
>- if (EFI_ERROR (Status)) {
>- *User = NULL;
>- if (UserInfo != NULL) {
>- *UserInfo = NULL;
>- }
>- return EFI_NOT_FOUND;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Return information attached to the user.
>-
>- This function returns user information. The format of the information is
>described in User
>- Information. The function may return EFI_ACCESS_DENIED if the
>information is marked private
>- and the handle specified by User is not the current user profile. The function
>may return
>- EFI_ACCESS_DENIED if the information is marked protected and the
>information is associated
>- with a credential provider for which the user has not been authenticated.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] User Handle of the user whose profile will be retrieved.
>- @param[in] UserInfo Handle of the user information data record.
>- @param[out] Info On entry, points to a buffer of at least *InfoSize
>bytes. On exit,
>- holds the user information. If the buffer is too small to hold
>the
>- information, then EFI_BUFFER_TOO_SMALL is returned and
>InfoSize is
>- updated to contain the number of bytes actually required.
>- @param[in, out] InfoSize On entry, points to the size of Info. On return,
>points to the size
>- of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_ACCESS_DENIED The information about the specified user
>cannot be accessed by the
>- current user.
>- @retval EFI_BUFFER_TOO_SMALL The number of bytes specified by
>*InfoSize is too small to hold the
>- returned data. The actual size required is returned in
>*InfoSize.
>- @retval EFI_NOT_FOUND User does not refer to a valid user profile or
>UserInfo does not refer
>- to a valid user info handle.
>- @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((This == NULL) || (InfoSize == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if ((*InfoSize != 0) && (Info == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- if ((User == NULL) || (UserInfo == NULL)) {
>- return EFI_NOT_FOUND;
>- }
>-
>- Status = GetUserInfo (User, UserInfo, Info, InfoSize, TRUE);
>- if (EFI_ERROR (Status)) {
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- return EFI_BUFFER_TOO_SMALL;
>- }
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Add or update user information.
>-
>- This function changes user information. If NULL is pointed to by UserInfo,
>then a new user
>- information record is created and its handle is returned in UserInfo.
>Otherwise, the existing
>- one is replaced.
>- If EFI_USER_INFO_IDENITTY_POLICY_RECORD is changed, it is the caller's
>responsibility to keep
>- it to be synced with the information on credential providers.
>- If EFI_USER_INFO_EXCLUSIVE is specified in Info and a user information
>record of the same
>- type already exists in the user profile, then EFI_ACCESS_DENIED will be
>returned and UserInfo
>- will point to the handle of the existing record.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] User Handle of the user whose profile will be retrieved.
>- @param[in, out] UserInfo Handle of the user information data record.
>- @param[in] Info On entry, points to a buffer of at least *InfoSize
>bytes. On exit,
>- holds the user information. If the buffer is too small to hold
>the
>- information, then EFI_BUFFER_TOO_SMALL is returned and
>InfoSize is
>- updated to contain the number of bytes actually required.
>- @param[in] InfoSize On entry, points to the size of Info. On return,
>points to the size
>- of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_ACCESS_DENIED The record is exclusive.
>- @retval EFI_SECURITY_VIOLATION The current user does not have
>permission to change the specified
>- user profile or user information record.
>- @retval EFI_NOT_FOUND User does not refer to a valid user profile or
>UserInfo does not
>- refer to a valid user info handle.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL or Info is NULL.
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileSetInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo,
>- IN CONST EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- )
>-{
>- EFI_STATUS Status;
>-
>- if ((This == NULL) || (User == NULL) || (UserInfo == NULL) || (Info == NULL))
>{
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check the right of the current user.
>- //
>- if (User != mCurrentUser) {
>- if (!CheckCurrentUserAccessRight (EFI_USER_INFO_ACCESS_MANAGE)) {
>- if (*UserInfo != NULL) {
>- //
>- // Can't update info in other profiles without MANAGE right.
>- //
>- return EFI_SECURITY_VIOLATION;
>- }
>-
>- if (!CheckCurrentUserAccessRight
>(EFI_USER_INFO_ACCESS_ENROLL_OTHERS)) {
>- //
>- // Can't add info into other profiles.
>- //
>- return EFI_SECURITY_VIOLATION;
>- }
>- }
>- }
>-
>- if (User == mCurrentUser) {
>- if (CheckCurrentUserAccessRight (EFI_USER_INFO_ACCESS_ENROLL_SELF))
>{
>- //
>- // Only identify policy can be added/updated.
>- //
>- if (Info->InfoType != EFI_USER_INFO_IDENTITY_POLICY_RECORD) {
>- return EFI_SECURITY_VIOLATION;
>- }
>- }
>- }
>-
>- //
>- // Modify user information.
>- //
>- Status = ModifyUserInfo (User, (EFI_USER_INFO **) UserInfo, Info,
>InfoSize);
>- if (EFI_ERROR (Status)) {
>- if (Status == EFI_ACCESS_DENIED) {
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_SECURITY_VIOLATION;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Called by credential provider to notify of information change.
>-
>- This function allows the credential provider to notify the User Identity
>Manager when user status
>- has changed.
>- If the User Identity Manager doesn't support asynchronous changes in
>credentials, then this function
>- should return EFI_UNSUPPORTED.
>- If current user does not exist, and the credential provider can identify a user,
>then make the user
>- to be current user and signal the
>EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.
>- If current user already exists, and the credential provider can identify
>another user, then switch
>- current user to the newly identified user, and signal the
>EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.
>- If current user was identified by this credential provider and now the
>credential provider cannot identify
>- current user, then logout current user and signal the
>EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] Changed Handle on which is installed an instance of the
>EFI_USER_CREDENTIAL2_PROTOCOL
>- where the user has changed.
>-
>- @retval EFI_SUCCESS The User Identity Manager has handled the
>notification.
>- @retval EFI_NOT_READY The function was called while the specified
>credential provider was not selected.
>- @retval EFI_UNSUPPORTED The User Identity Manager doesn't support
>asynchronous notifications.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileNotify (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_HANDLE Changed
>- )
>-{
>- return EFI_UNSUPPORTED;
>-}
>-
>-
>-/**
>- Delete user information.
>-
>- Delete the user information attached to the user profile specified by the
>UserInfo.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] User Handle of the user whose information will be
>deleted.
>- @param[in] UserInfo Handle of the user information to remove.
>-
>- @retval EFI_SUCCESS User information deleted successfully.
>- @retval EFI_NOT_FOUND User information record UserInfo does not
>exist in the user profile.
>- @retval EFI_ACCESS_DENIED The current user does not have permission to
>delete this user information.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileDeleteInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN EFI_USER_INFO_HANDLE UserInfo
>- )
>-{
>- EFI_STATUS Status;
>-
>- if (This == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Check the right of the current user.
>- //
>- if (User != mCurrentUser) {
>- if (!CheckCurrentUserAccessRight (EFI_USER_INFO_ACCESS_MANAGE)) {
>- return EFI_ACCESS_DENIED;
>- }
>- }
>-
>- //
>- // Delete user information.
>- //
>- Status = DelUserInfo (User, UserInfo, TRUE);
>- if (EFI_ERROR (Status)) {
>- if (Status == EFI_NOT_FOUND) {
>- return EFI_NOT_FOUND;
>- }
>- return EFI_ACCESS_DENIED;
>- }
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Enumerate user information of all the enrolled users on the platform.
>-
>- This function returns the next user information record. To retrieve the first
>user
>- information record handle, point UserInfo at a NULL. Each subsequent call
>will retrieve
>- another user information record handle until there are no more, at which
>point UserInfo
>- will point to NULL.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in] User Handle of the user whose information will be
>deleted.
>- @param[in, out] UserInfo Handle of the user information to remove.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>- @retval EFI_INVALID_PARAMETER UserInfo is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetNextInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- )
>-{
>- if ((This == NULL) || (UserInfo == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>- //
>- // Get next user information entry.
>- //
>- return FindUserInfo (User, (EFI_USER_INFO **) UserInfo, TRUE, NULL);
>-}
>-
>-
>-/**
>- Main entry for this driver.
>-
>- @param[in] ImageHandle Image handle this driver.
>- @param[in] SystemTable Pointer to SystemTable.
>-
>- @retval EFI_SUCESS This function always complete successfully.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserIdentifyManagerInit (
>- IN EFI_HANDLE ImageHandle,
>- IN EFI_SYSTEM_TABLE *SystemTable
>- )
>-{
>-
>- EFI_STATUS Status;
>-
>- //
>- // It is NOT robust enough to be included in production.
>- //
>- #error "This implementation is just a sample, please comment this line if you
>really want to use this driver."
>-
>- //
>- // Initiate form browser.
>- //
>- InitFormBrowser ();
>-
>- //
>- // Install protocol interfaces for the User Identity Manager.
>- //
>- Status = gBS->InstallProtocolInterface (
>- &mCallbackInfo->DriverHandle,
>- &gEfiUserManagerProtocolGuid,
>- EFI_NATIVE_INTERFACE,
>- &gUserIdentifyManager
>- );
>- ASSERT_EFI_ERROR (Status);
>-
>- LoadDeferredImageInit (ImageHandle);
>- return EFI_SUCCESS;
>-}
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.h
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.h
>deleted file mode 100644
>index 1c449b0128..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.h
>+++ /dev/null
>@@ -1,413 +0,0 @@
>-/** @file
>- The header file for User identify Manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef _USER_IDENTIFY_MANAGER_H_
>-#define _USER_IDENTIFY_MANAGER_H_
>-
>-#include <Uefi.h>
>-
>-#include <Guid/GlobalVariable.h>
>-#include <Guid/MdeModuleHii.h>
>-
>-#include <Protocol/FormBrowser2.h>
>-#include <Protocol/HiiDatabase.h>
>-#include <Protocol/HiiConfigAccess.h>
>-#include <Protocol/HiiString.h>
>-#include <Protocol/HiiConfigRouting.h>
>-#include <Protocol/UserCredential2.h>
>-#include <Protocol/UserManager.h>
>-#include <Protocol/DeferredImageLoad.h>
>-#include <Protocol/SimpleTextOut.h>
>-#include <Protocol/SimpleTextIn.h>
>-#include <Protocol/SimpleTextInEx.h>
>-
>-#include <Library/UefiRuntimeServicesTableLib.h>
>-#include <Library/UefiBootServicesTableLib.h>
>-#include <Library/MemoryAllocationLib.h>
>-#include <Library/BaseMemoryLib.h>
>-#include <Library/DevicePathLib.h>
>-#include <Library/DebugLib.h>
>-#include <Library/UefiLib.h>
>-#include <Library/PrintLib.h>
>-#include <Library/HiiLib.h>
>-
>-#include "UserIdentifyManagerData.h"
>-
>-//
>-// This is the generated IFR binary data for each formset defined in VFR.
>-// This data array is ready to be used as input of HiiAddPackages() to
>-// create a packagelist.
>-//
>-extern UINT8 UserIdentifyManagerVfrBin[];
>-
>-//
>-// This is the generated String package data for all .UNI files.
>-// This data array is ready to be used as input of HiiAddPackages() to
>-// create a packagelist.
>-//
>-extern UINT8 UserIdentifyManagerStrings[];
>-
>-#define USER_NUMBER_INC 32
>-#define DEFAULT_PROFILE_SIZE 512
>-#define INFO_PAYLOAD_SIZE 64
>-
>-//
>-// Credential Provider Information.
>-//
>-typedef struct {
>- UINTN Count;
>- EFI_USER_CREDENTIAL2_PROTOCOL *Provider[1];
>-} CREDENTIAL_PROVIDER_INFO;
>-
>-//
>-// Internal user profile entry.
>-//
>-typedef struct {
>- UINTN MaxProfileSize;
>- UINTN UserProfileSize;
>- CHAR16 UserVarName[9];
>- UINT8 *ProfileInfo;
>-} USER_PROFILE_ENTRY;
>-
>-//
>-// Internal user profile database.
>-//
>-typedef struct {
>- UINTN UserProfileNum;
>- UINTN MaxProfileNum;
>- EFI_USER_PROFILE_HANDLE UserProfile[1];
>-} USER_PROFILE_DB;
>-
>-#define USER_MANAGER_SIGNATURE SIGNATURE_32 ('U', 'I', 'M', 'S')
>-
>-typedef struct {
>- UINTN Signature;
>- EFI_HANDLE DriverHandle;
>- EFI_HII_HANDLE HiiHandle;
>-
>- //
>- // Consumed protocol.
>- //
>- EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
>- EFI_HII_STRING_PROTOCOL *HiiString;
>- EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
>- EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
>-
>- //
>- // Produced protocol.
>- //
>- EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
>-} USER_MANAGER_CALLBACK_INFO;
>-
>-///
>-/// HII specific Vendor Device Path definition.
>-///
>-typedef struct {
>- VENDOR_DEVICE_PATH VendorDevicePath;
>- EFI_DEVICE_PATH_PROTOCOL End;
>-} HII_VENDOR_DEVICE_PATH;
>-
>-/**
>- Register an event notification function for the user profile changed.
>-
>- @param[in] ImageHandle Image handle this driver.
>-
>-**/
>-VOID
>-LoadDeferredImageInit (
>- IN EFI_HANDLE ImageHandle
>- );
>-
>-
>-/**
>- This function creates a new user profile with only
>- a new user identifier attached and returns its handle.
>- The user profile is non-volatile, but the handle User
>- can change across reboots.
>-
>- @param[in] This Protocol EFI_USER_MANAGER_PROTOCOL
>instance
>- pointer.
>- @param[out] User Handle of a new user profile.
>-
>- @retval EFI_SUCCESS User profile was successfully created.
>- @retval EFI_ACCESS_DENIED Current user does not have sufficient
>permissions
>- to create a user profile.
>- @retval EFI_UNSUPPORTED Creation of new user profiles is not
>supported.
>- @retval EFI_INVALID_PARAMETER User is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileCreate (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *User
>- );
>-
>-
>-/**
>- Delete an existing user profile.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>- pointer.
>- @param User User profile handle.
>-
>- @retval EFI_SUCCESS User profile was successfully deleted.
>- @retval EFI_ACCESS_DENIED Current user does not have sufficient
>permissions
>- to delete a user profile or there is only one
>- user profile.
>- @retval EFI_UNSUPPORTED Deletion of new user profiles is not
>supported.
>- @retval EFI_INVALID_PARAMETER User does not refer to a valid user
>profile.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileDelete (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-
>-/**
>- Get next user profile from the user profile database.
>-
>- @param[in] This Protocol EFI_USER_MANAGER_PROTOCOL
>instance
>- pointer.
>- @param[in, out] User User profile handle.
>-
>- @retval EFI_SUCCESS Next enrolled user profile successfully returned.
>- @retval EFI_INVALID_PARAMETER User is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetNext (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN OUT EFI_USER_PROFILE_HANDLE *User
>- );
>-
>-
>-/**
>- This function returns the current user profile handle.
>-
>- @param[in] This Protocol EFI_USER_MANAGER_PROTOCOL
>instance pointer.
>- @param[out] CurrentUser User profile handle.
>-
>- @retval EFI_SUCCESS Current user profile handle returned
>successfully.
>- @retval EFI_INVALID_PARAMETER CurrentUser is NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileCurrent (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *CurrentUser
>- );
>-
>-
>-/**
>- Identify the user and, if authenticated, returns the user handle and changes
>- the current user profile.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>pointer.
>- @param CurrentUser User profile handle.
>-
>- @retval EFI_SUCCESS User was successfully identified.
>- @retval EFI_INVALID_PARAMETER User is NULL.
>- @retval EFI_ACCESS_DENIED User was not successfully identified.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileIdentify (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- OUT EFI_USER_PROFILE_HANDLE *User
>- );
>-
>-
>-/**
>- Find a user using a user information record.
>-
>- This function searches all user profiles for the specified user information
>record.
>- The search starts with the user information record handle following
>UserInfo and
>- continues until either the information is found or there are no more user
>profiles.
>- A match occurs when the Info.InfoType field matches the user information
>record
>- type and the user information record data matches the portion of Info
>passed the
>- EFI_USER_INFO header.
>-
>- @param[in] This Points to this instance of the
>EFI_USER_MANAGER_PROTOCOL.
>- @param[in, out] User On entry, points to the previously returned user
>profile
>- handle, or NULL to start searching with the first user profile.
>- On return, points to the user profile handle, or NULL if not
>- found.
>- @param[in, out] UserInfo On entry, points to the previously returned user
>information
>- handle, or NULL to start searching with the first. On return,
>- points to the user information handle of the user information
>- record, or NULL if not found. Can be NULL, in which case only
>- one user information record per user can be returned.
>- @param[in] Info Points to the buffer containing the user information to
>be
>- compared to the user information record. If NULL, then only
>- the user information record type is compared. If InfoSize is 0,
>- then the user information record must be empty.
>-
>- @param[in] InfoSize The size of Info, in bytes.
>-
>- @retval EFI_SUCCESS User information was found. User points to the
>user profile handle,
>- and UserInfo points to the user information handle.
>- @retval EFI_NOT_FOUND User information was not found. User points to
>NULL and UserInfo
>- points to NULL.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileFind (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN OUT EFI_USER_PROFILE_HANDLE *User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo OPTIONAL,
>- IN CONST EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- );
>-
>-
>-/**
>- This function returns user information.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>- pointer.
>- @param User Handle of the user whose profile will be
>- retrieved.
>- @param UserInfo Handle of the user information data record.
>- @param Info On entry, points to a buffer of at least
>- *InfoSize bytes. On exit, holds the user
>- information.
>- @param InfoSize On entry, points to the size of Info. On return,
>- points to the size of the user information.
>-
>- @retval EFI_SUCCESS Information returned successfully.
>- @retval EFI_ACCESS_DENIED The information about the specified user
>cannot
>- be accessed by the current user.
>- EFI_BUFFER_TOO_SMALL- The number of bytes
>- specified by *InfoSize is too small to hold the
>- returned data.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN EFI_USER_INFO_HANDLE UserInfo,
>- OUT EFI_USER_INFO *Info,
>- IN OUT UINTN *InfoSize
>- );
>-
>-
>-/**
>- This function changes user information.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>- pointer.
>- @param User Handle of the user whose profile will be
>- retrieved.
>- @param UserInfo Handle of the user information data record.
>- @param Info Points to the user information.
>- @param InfoSize The size of Info, in bytes.
>-
>- @retval EFI_SUCCESS User profile information was successfully
>- changed/added.
>- @retval EFI_ACCESS_DENIED The record is exclusive.
>- @retval EFI_SECURITY_VIOLATION The current user does not have
>permission to
>- change the specified user profile or user
>- information record.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileSetInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo,
>- IN CONST EFI_USER_INFO *Info,
>- IN UINTN InfoSize
>- );
>-
>-
>-/**
>- This function allows the credential provider to notify the User Identity
>Manager
>- when user status has changed while deselected.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>- pointer.
>- @param Changed Points to the instance of the
>- EFI_USER_CREDENTIAL_PROTOCOL where the user has
>- changed.
>-
>- @retval EFI_SUCCESS The User Identity Manager has handled the
>- notification.
>- @retval EFI_NOT_READY The function was called while the specified
>- credential provider was not selected.
>- @retval EFI_UNSUPPORTED The User Identity Manager doesn't support
>- asynchronous notifications.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileNotify (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_HANDLE Changed
>- );
>-
>-
>-/**
>- Delete the user information attached to the user profile specified by the
>UserInfo.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>pointer.
>- @param User Handle of the user whose profile will be retrieved.
>- @param UserInfo Handle of the user information data record.
>-
>- @retval EFI_SUCCESS User information deleted successfully.
>- @retval EFI_ACCESS_DENIED The current user does not have permission
>to
>- delete this user in-formation.
>- @retval EFI_NOT_FOUND User information record UserInfo does not
>exist
>- in the user pro-file.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileDeleteInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN EFI_USER_INFO_HANDLE UserInfo
>- );
>-
>-
>-/**
>- This function returns the next user information record.
>-
>- @param This Protocol EFI_USER_MANAGER_PROTOCOL instance
>pointer.
>- @param User Handle of the user whose profile will be retrieved.
>- @param UserInfo Handle of the user information data record.
>-
>- @retval EFI_SUCCESS User information returned.
>- @retval EFI_NOT_FOUND No more user information found.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileGetNextInfo (
>- IN CONST EFI_USER_MANAGER_PROTOCOL *This,
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN OUT EFI_USER_INFO_HANDLE *UserInfo
>- );
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.uni
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.uni
>deleted file mode 100644
>index 82c72baeeb..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>ager.uni
>+++ /dev/null
>@@ -1,21 +0,0 @@
>-// /** @file
>-// Produces user manager protocol
>-//
>-// This module manages user information and produces user manager
>protocol.
>-//
>-// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-
>-#string STR_MODULE_ABSTRACT #language en-US "Produces user
>manager protocol"
>-
>-#string STR_MODULE_DESCRIPTION #language en-US "This module
>manages user information and produces user manager protocol."
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerData.h
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerData.h
>deleted file mode 100644
>index 4e07ddd309..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerData.h
>+++ /dev/null
>@@ -1,35 +0,0 @@
>-/** @file
>- Data structure used by the user identify manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef _USER_IDENTIFY_MANAGER_DATA_H_
>-#define _USER_IDENTIFY_MANAGER_DATA_H_
>-
>-#include <Guid/UserIdentifyManagerHii.h>
>-
>-//
>-// Forms definition.
>-//
>-#define FORMID_USER_FORM 1
>-#define FORMID_PROVIDER_FORM 2
>-#define FORMID_INVALID_FORM 0x0FFF
>-
>-//
>-// Labels definition.
>-//
>-#define LABEL_USER_NAME 0x1000
>-#define LABEL_PROVIDER_NAME 0x3000
>-#define LABEL_END 0xffff
>-#define FORM_OPEN_QUESTION_ID 0xfffe
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerDxe.inf
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerDxe.inf
>deleted file mode 100644
>index 27e8ba19ad..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerDxe.inf
>+++ /dev/null
>@@ -1,79 +0,0 @@
>-## @file
>-# Produces user manager protocol
>-#
>-# This module manages user information and produces user manager
>protocol.
>-#
>-# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-# This program and the accompanying materials
>-# are licensed and made available under the terms and conditions of the BSD
>License
>-# which accompanies this distribution. The full text of the license may be
>found at
>-# http://opensource.org/licenses/bsd-license.php
>-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-#
>-##
>-
>-[defines]
>- INF_VERSION = 0x00010005
>- BASE_NAME = UserIdentifyManager
>- MODULE_UNI_FILE = UserIdentifyManager.uni
>- FILE_GUID = C5D3191B-27D5-4873-8DF2-628136991A21
>- MODULE_TYPE = DXE_DRIVER
>- VERSION_STRING = 1.0
>- ENTRY_POINT = UserIdentifyManagerInit
>-
>-[sources]
>- UserIdentifyManager.c
>- LoadDeferredImage.c
>- UserIdentifyManager.h
>- UserIdentifyManagerData.h
>- UserIdentifyManagerStrings.uni
>- UserIdentifyManagerVfr.Vfr
>-
>-[Packages]
>- MdePkg/MdePkg.dec
>- MdeModulePkg/MdeModulePkg.dec
>- SecurityPkg/SecurityPkg.dec
>-
>-[LibraryClasses]
>- UefiRuntimeServicesTableLib
>- UefiBootServicesTableLib
>- UefiDriverEntryPoint
>- MemoryAllocationLib
>- BaseMemoryLib
>- DebugLib
>- HiiLib
>- UefiLib
>-
>-[Guids]
>- gEfiIfrTianoGuid ## SOMETIMES_CONSUMES ## GUID
>- gEfiEventUserProfileChangedGuid ## SOMETIMES_PRODUCES ##
>Event
>-
>- ## SOMETIMES_PRODUCES ## Variable:L"Userxxxx"
>- ## SOMETIMES_CONSUMES ## Variable:L"Userxxxx"
>- ## CONSUMES ## HII
>- gUserIdentifyManagerGuid
>-
>-[Protocols]
>- gEfiFormBrowser2ProtocolGuid ## CONSUMES
>- gEfiHiiDatabaseProtocolGuid ## CONSUMES
>- gEfiUserCredential2ProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiDeferredImageLoadProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiSimpleTextOutProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiSimpleTextInProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiSimpleTextInputExProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiHiiConfigAccessProtocolGuid ## PRODUCES
>- gEfiDevicePathProtocolGuid ## PRODUCES
>-
>- ## PRODUCES
>- ## SOMETIMES_PRODUCES ## SystemTable
>- gEfiUserManagerProtocolGuid
>-
>-[Depex]
>- gEfiHiiDatabaseProtocolGuid AND
>- gEfiHiiStringProtocolGuid AND
>- gEfiFormBrowser2ProtocolGuid
>-
>-[UserExtensions.TianoCore."ExtraFiles"]
>- UserIdentifyManagerExtra.uni
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerExtra.uni
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerExtra.uni
>deleted file mode 100644
>index 8b7cba7b32..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerExtra.uni
>+++ /dev/null
>@@ -1,19 +0,0 @@
>-// /** @file
>-// UserIdentifyManager Localized Strings and Content
>-//
>-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-#string STR_PROPERTIES_MODULE_NAME
>-#language en-US
>-"User Identify Manager"
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerStrings.uni
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerStrings.uni
>deleted file mode 100644
>index fcbf5005cd..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerStrings.uni
>+++ /dev/null
>@@ -1,27 +0,0 @@
>-/** @file
>- String definitions for the User Identify Manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php.
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#langdef en-US "English"
>-#langdef fr-FR "Francais"
>-
>-#string STR_TITLE #language en-US "User Identity Manager"
>- #language fr-FR "User Identity Manager(French)"
>-#string STR_USER_SELECT #language en-US "User Selection"
>- #language fr-FR "User Selection(French)"
>-#string STR_PROVIDER_SELECT #language en-US "Provider
>Selection"
>- #language fr-FR "User Selection(French)"
>-#string STR_NULL_STRING #language en-US ""
>- #language fr-FR ""
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerVfr.Vfr
>b/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerVfr.Vfr
>deleted file mode 100644
>index 306679776d..0000000000
>---
>a/SecurityPkg/UserIdentification/UserIdentifyManagerDxe/UserIdentifyMan
>agerVfr.Vfr
>+++ /dev/null
>@@ -1,43 +0,0 @@
>-/** @file
>- User identify manager formset.
>-
>-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserIdentifyManagerData.h"
>-
>-formset
>- guid = USER_IDENTIFY_MANAGER_GUID,
>- title = STRING_TOKEN(STR_TITLE),
>- help = STRING_TOKEN(STR_NULL_STRING),
>- classguid = USER_IDENTIFY_MANAGER_GUID,
>-
>- form formid = FORMID_USER_FORM,
>- title = STRING_TOKEN(STR_USER_SELECT);
>-
>- suppressif TRUE;
>- text
>- help = STRING_TOKEN(STR_NULL_STRING),
>- text = STRING_TOKEN(STR_NULL_STRING),
>- flags = INTERACTIVE,
>- key = FORM_OPEN_QUESTION_ID;
>- endif;
>-
>- label LABEL_USER_NAME;
>- label LABEL_END;
>- endform;
>-
>- form formid = FORMID_PROVIDER_FORM,
>- title = STRING_TOKEN(STR_PROVIDER_SELECT);
>- label LABEL_PROVIDER_NAME;
>- label LABEL_END;
>- endform;
>-endformset;
>\ No newline at end of file
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolic
>y.c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolic
>y.c
>deleted file mode 100644
>index 56d3b1df98..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyAccessPolic
>y.c
>+++ /dev/null
>@@ -1,688 +0,0 @@
>-/** @file
>- The functions for access policy modification.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-/**
>- Collect all the access policy data to mUserInfo.AccessPolicy,
>- and save it to user profile.
>-
>-**/
>-VOID
>-SaveAccessPolicy (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINTN OffSet;
>- UINTN Size;
>- EFI_USER_INFO_ACCESS_CONTROL Control;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>-
>- if (mUserInfo.AccessPolicy != NULL) {
>- FreePool (mUserInfo.AccessPolicy);
>- }
>- mUserInfo.AccessPolicy = NULL;
>- mUserInfo.AccessPolicyLen = 0;
>- mUserInfo.AccessPolicyModified = TRUE;
>- OffSet = 0;
>-
>- //
>- // Save access right.
>- //
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = mAccessInfo.AccessRight;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- //
>- // Save access setup.
>- //
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID);
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_SETUP;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) {
>- CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet),
>&gEfiUserInfoAccessSetupNormalGuid);
>- } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) {
>- CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet),
>&gEfiUserInfoAccessSetupRestrictedGuid);
>- } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) {
>- CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet),
>&gEfiUserInfoAccessSetupAdminGuid);
>- }
>- OffSet += sizeof (EFI_GUID);
>-
>- //
>- // Save access of boot order.
>- //
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32);
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet),
>&mAccessInfo.AccessBootOrder, sizeof (UINT32));
>- OffSet += sizeof (UINT32);
>-
>- //
>- // Save permit load.
>- //
>- if (mAccessInfo.LoadPermitLen > 0) {
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) +
>mAccessInfo.LoadPermitLen;
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit,
>mAccessInfo.LoadPermitLen);
>- OffSet += mAccessInfo.LoadPermitLen;
>- }
>-
>- //
>- // Save forbid load.
>- //
>- if (mAccessInfo.LoadForbidLen > 0) {
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) +
>mAccessInfo.LoadForbidLen;
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid,
>mAccessInfo.LoadForbidLen);
>- OffSet += mAccessInfo.LoadForbidLen;
>- }
>-
>- //
>- // Save permit connect.
>- //
>- if (mAccessInfo.ConnectPermitLen > 0) {
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) +
>mAccessInfo.ConnectPermitLen;
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit,
>mAccessInfo.ConnectPermitLen);
>- OffSet += mAccessInfo.ConnectPermitLen;
>- }
>-
>- //
>- // Save forbid connect.
>- //
>- if (mAccessInfo.ConnectForbidLen > 0) {
>- Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) +
>mAccessInfo.ConnectForbidLen;
>- if (mUserInfo.AccessPolicyLen - OffSet < Size) {
>- ExpandMemory (OffSet, Size);
>- }
>-
>- Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT;
>- Control.Size = (UINT32) Size;
>- CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
>- OffSet += sizeof (Control);
>-
>- CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid,
>mAccessInfo.ConnectForbidLen);
>- OffSet += mAccessInfo.ConnectForbidLen;
>- }
>-
>- mUserInfo.AccessPolicyLen = OffSet;
>-
>- //
>- // Save access policy.
>- //
>- if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0)
>&& (mUserInfo.AccessPolicy != NULL)) {
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) +
>mUserInfo.AccessPolicyLen);
>- if (Info == NULL) {
>- return ;
>- }
>-
>- Status = FindInfoByType (mModifyUser,
>EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo);
>- if (!EFI_ERROR (Status)) {
>- Info->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) +
>mUserInfo.AccessPolicyLen);
>- CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy,
>mUserInfo.AccessPolicyLen);
>- Status = mUserManager->SetInfo (
>- mUserManager,
>- mModifyUser,
>- &UserInfo,
>- Info,
>- Info->InfoSize
>- );
>- mUserInfo.AccessPolicyModified = FALSE;
>- }
>- FreePool (Info);
>- }
>-
>- if (mAccessInfo.ConnectForbid != NULL) {
>- FreePool (mAccessInfo.ConnectForbid);
>- mAccessInfo.ConnectForbid = NULL;
>- }
>-
>- if (mAccessInfo.ConnectPermit != NULL) {
>- FreePool (mAccessInfo.ConnectPermit);
>- mAccessInfo.ConnectPermit = NULL;
>- }
>-
>- if (mAccessInfo.LoadForbid != NULL) {
>- FreePool (mAccessInfo.LoadForbid);
>- mAccessInfo.LoadForbid = NULL;
>- }
>-
>- if (mAccessInfo.LoadPermit != NULL) {
>- FreePool (mAccessInfo.LoadPermit);
>- mAccessInfo.LoadPermit = NULL;
>- }
>-}
>-
>-/**
>- Create an action OpCode with QuestionID and DevicePath on a given
>OpCodeHandle.
>-
>- @param[in] QuestionID The question ID.
>- @param[in] DevicePath Points to device path.
>- @param[in] OpCodeHandle Points to container for dynamic created
>opcodes.
>-
>-**/
>-VOID
>-AddDevicePath (
>- IN UINTN QuestionID,
>- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>- IN VOID *OpCodeHandle
>- )
>-{
>- EFI_DEVICE_PATH_PROTOCOL *Next;
>- EFI_STRING_ID NameID;
>- EFI_STRING DriverName;
>-
>- //
>- // Get driver file name node.
>- //
>- Next = DevicePath;
>- while (!IsDevicePathEnd (Next)) {
>- DevicePath = Next;
>- Next = NextDevicePathNode (Next);
>- }
>-
>- //
>- // Display the device path in form.
>- //
>- DriverName = ConvertDevicePathToText (DevicePath, FALSE, FALSE);
>- NameID = HiiSetString (mCallbackInfo->HiiHandle, 0, DriverName, NULL);
>- FreePool (DriverName);
>- if (NameID == 0) {
>- return ;
>- }
>-
>- HiiCreateActionOpCode (
>- OpCodeHandle, // Container for dynamic created opcodes
>- (UINT16) QuestionID, // Question ID
>- NameID, // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- 0 // Action String ID
>- );
>-}
>-
>-
>-/**
>- Check whether the DevicePath is in the device path forbid list
>- (mAccessInfo.LoadForbid).
>-
>- @param[in] DevicePath Points to device path.
>-
>- @retval TRUE The DevicePath is in the device path forbid list.
>- @retval FALSE The DevicePath is not in the device path forbid list.
>-
>-**/
>-BOOLEAN
>-IsLoadForbidden (
>- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
>- )
>-{
>- UINTN OffSet;
>- UINTN DPSize;
>- UINTN Size;
>- EFI_DEVICE_PATH_PROTOCOL *Dp;
>-
>- OffSet = 0;
>- Size = GetDevicePathSize (DevicePath);
>- //
>- // Check each device path.
>- //
>- while (OffSet < mAccessInfo.LoadForbidLen) {
>- Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid +
>OffSet);
>- DPSize = GetDevicePathSize (Dp);
>- //
>- // Compare device path.
>- //
>- if ((DPSize == Size) && (CompareMem (DevicePath, Dp, Size) == 0)) {
>- return TRUE;
>- }
>- OffSet += DPSize;
>- }
>- return FALSE;
>-}
>-
>-
>-/**
>- Display the permit load device path in the loadable device path list.
>-
>-**/
>-VOID
>-DisplayLoadPermit(
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- CHAR16 *Order;
>- UINTN OrderSize;
>- UINTN ListCount;
>- UINTN Index;
>- UINT8 *Var;
>- UINT8 *VarPtr;
>- CHAR16 VarName[12];
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Get DriverOrder.
>- //
>- OrderSize = 0;
>- Status = gRT->GetVariable (
>- L"DriverOrder",
>- &gEfiGlobalVariableGuid,
>- NULL,
>- &OrderSize,
>- NULL
>- );
>- if (Status != EFI_BUFFER_TOO_SMALL) {
>- return ;
>- }
>-
>- Order = AllocateZeroPool (OrderSize);
>- if (Order == NULL) {
>- return ;
>- }
>-
>- Status = gRT->GetVariable (
>- L"DriverOrder",
>- &gEfiGlobalVariableGuid,
>- NULL,
>- &OrderSize,
>- Order
>- );
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_PERMIT_LOAD_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add each driver option.
>- //
>- Var = NULL;
>- ListCount = OrderSize / sizeof (UINT16);
>- for (Index = 0; Index < ListCount; Index++) {
>- //
>- // Get driver device path.
>- //
>- UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", Order[Index]);
>- GetEfiGlobalVariable2 (VarName, (VOID**)&Var, NULL);
>- if (Var == NULL) {
>- continue;
>- }
>-
>- //
>- // Check whether the driver is already forbidden.
>- //
>-
>- VarPtr = Var;
>- //
>- // Skip attribute.
>- //
>- VarPtr += sizeof (UINT32);
>-
>- //
>- // Skip device path lenth.
>- //
>- VarPtr += sizeof (UINT16);
>-
>- //
>- // Skip descript string.
>- //
>- VarPtr += StrSize ((UINT16 *) VarPtr);
>-
>- if (IsLoadForbidden ((EFI_DEVICE_PATH_PROTOCOL *) VarPtr)) {
>- FreePool (Var);
>- Var = NULL;
>- continue;
>- }
>-
>- AddDevicePath (
>- KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_PERMIT_MODIFY
>| Order[Index],
>- (EFI_DEVICE_PATH_PROTOCOL *) VarPtr,
>- StartOpCodeHandle
>- );
>- FreePool (Var);
>- Var = NULL;
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_PERMIT_LOAD_DP, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-
>- //
>- // Clear Environment.
>- //
>- if (Var != NULL) {
>- FreePool (Var);
>- }
>- FreePool (Order);
>-}
>-
>-
>-/**
>- Display the forbid load device path list (mAccessInfo.LoadForbid).
>-
>-**/
>-VOID
>-DisplayLoadForbid (
>- VOID
>- )
>-{
>- UINTN Offset;
>- UINTN DPSize;
>- UINTN Index;
>- EFI_DEVICE_PATH_PROTOCOL *Dp;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABLE_FORBID_LOAD_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add each forbid load drivers.
>- //
>- Offset = 0;
>- Index = 0;
>- while (Offset < mAccessInfo.LoadForbidLen) {
>- Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid +
>Offset);
>- DPSize = GetDevicePathSize (Dp);
>- AddDevicePath (
>- KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_FORBID_MODIFY
>| Index,
>- Dp,
>- StartOpCodeHandle
>- );
>- Index++;
>- Offset += DPSize;
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_FORBID_LOAD_DP, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>-
>-
>-/**
>- Display the permit connect device path.
>-
>-**/
>-VOID
>-DisplayConnectPermit (
>- VOID
>- )
>-{
>- //
>- // Note:
>- // As no architect protocol/interface to be called in ConnectController()
>- // to verify the device path, just add a place holder for permitted connect
>- // device path.
>- //
>-}
>-
>-
>-/**
>- Display the forbid connect device path list.
>-
>-**/
>-VOID
>-DisplayConnectForbid (
>- VOID
>- )
>-{
>- //
>- // Note:
>- // As no architect protocol/interface to be called in ConnectController()
>- // to verify the device path, just add a place holder for forbidden connect
>- // device path.
>- //
>-}
>-
>-
>-/**
>- Delete the specified device path by DriverIndex from the forbid device path
>- list (mAccessInfo.LoadForbid).
>-
>- @param[in] DriverIndex The index of driver in forbidden device path list.
>-
>-**/
>-VOID
>-DeleteFromForbidLoad (
>- IN UINT16 DriverIndex
>- )
>-{
>- UINTN OffSet;
>- UINTN DPSize;
>- UINTN OffLen;
>- EFI_DEVICE_PATH_PROTOCOL *Dp;
>-
>- OffSet = 0;
>- //
>- // Find the specified device path.
>- //
>- while ((OffSet < mAccessInfo.LoadForbidLen) && (DriverIndex > 0)) {
>- Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid +
>OffSet);
>- DPSize = GetDevicePathSize (Dp);
>- OffSet += DPSize;
>- DriverIndex--;
>- }
>-
>- //
>- // Specified device path found.
>- //
>- if (DriverIndex == 0) {
>- Dp = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid +
>OffSet);
>- DPSize = GetDevicePathSize (Dp);
>- OffLen = mAccessInfo.LoadForbidLen - OffSet - DPSize;
>- if (OffLen > 0) {
>- CopyMem (
>- mAccessInfo.LoadForbid + OffSet,
>- mAccessInfo.LoadForbid + OffSet + DPSize,
>- OffLen
>- );
>- }
>- mAccessInfo.LoadForbidLen -= DPSize;
>- }
>-}
>-
>-
>-/**
>- Add the specified device path by DriverIndex to the forbid device path
>- list (mAccessInfo.LoadForbid).
>-
>- @param[in] DriverIndex The index of driver saved in driver options.
>-
>-**/
>-VOID
>-AddToForbidLoad (
>- IN UINT16 DriverIndex
>- )
>-{
>- UINTN DevicePathLen;
>- UINT8 *Var;
>- UINT8 *VarPtr;
>- UINTN NewLen;
>- UINT8 *NewFL;
>- CHAR16 VarName[13];
>-
>- //
>- // Get loadable driver device path.
>- //
>- UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", DriverIndex);
>- GetEfiGlobalVariable2 (VarName, (VOID**)&Var, NULL);
>- if (Var == NULL) {
>- return;
>- }
>-
>- //
>- // Save forbid load driver.
>- //
>-
>- VarPtr = Var;
>- //
>- // Skip attribute.
>- //
>- VarPtr += sizeof (UINT32);
>-
>- DevicePathLen = *(UINT16 *) VarPtr;
>- //
>- // Skip device path length.
>- //
>- VarPtr += sizeof (UINT16);
>-
>- //
>- // Skip description string.
>- //
>- VarPtr += StrSize ((UINT16 *) VarPtr);
>-
>- NewLen = mAccessInfo.LoadForbidLen + DevicePathLen;
>- NewFL = AllocateZeroPool (NewLen);
>- if (NewFL == NULL) {
>- FreePool (Var);
>- return ;
>- }
>-
>- if (mAccessInfo.LoadForbidLen > 0) {
>- CopyMem (NewFL, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);
>- FreePool (mAccessInfo.LoadForbid);
>- }
>-
>- CopyMem (NewFL + mAccessInfo.LoadForbidLen, VarPtr, DevicePathLen);
>- mAccessInfo.LoadForbidLen = NewLen;
>- mAccessInfo.LoadForbid = NewFL;
>- FreePool (Var);
>-}
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPoli
>cy.c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPoli
>cy.c
>deleted file mode 100644
>index 602c4a8397..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/ModifyIdentityPoli
>cy.c
>+++ /dev/null
>@@ -1,516 +0,0 @@
>-/** @file
>- The functions for identification policy modification.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-
>-/**
>- Verify the new identity policy in the current implementation. The same
>credential
>- provider can't appear twice in one identity policy.
>-
>- @param[in] NewGuid Points to the credential provider guid.
>-
>- @retval TRUE The NewGuid was found in the identity policy.
>- @retval FALSE The NewGuid was not found.
>-
>-**/
>-BOOLEAN
>-ProviderAlreadyInPolicy (
>- IN EFI_GUID *NewGuid
>- )
>-{
>- UINTN Offset;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- EFI_INPUT_KEY Key;
>-
>- Offset = 0;
>- while (Offset < mUserInfo.NewIdentityPolicyLen) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *)
>(mUserInfo.NewIdentityPolicy + Offset);
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {
>- if (CompareGuid (NewGuid, (EFI_GUID *) (Identity + 1))) {
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"This Credential Provider Are Already Used!",
>- L"",
>- L"Press Any Key to Continue ...",
>- NULL
>- );
>- return TRUE;
>- }
>- }
>- Offset += Identity->Length;
>- }
>-
>- return FALSE;
>-}
>-
>-
>-/**
>- Add the user's credential record in the provider.
>-
>- @param[in] Identity Identity policy item including credential provider.
>- @param[in] User Points to user profile.
>-
>- @retval EFI_SUCCESS Add or delete record successfully.
>- @retval Others Fail to add or delete record.
>-
>-**/
>-EFI_STATUS
>-EnrollUserOnProvider (
>- IN EFI_USER_INFO_IDENTITY_POLICY *Identity,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- UINTN Index;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>-
>- //
>- // Find the specified credential provider.
>- //
>- for (Index = 0; Index < mProviderInfo->Count; Index++) {
>- UserCredential = mProviderInfo->Provider[Index];
>- if (CompareGuid ((EFI_GUID *)(Identity + 1), &UserCredential->Identifier))
>{
>- return UserCredential->Enroll (UserCredential, User);
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Delete the User's credential record on the provider.
>-
>- @param[in] Identity Point to
>EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER user info.
>- @param[in] User Points to user profile.
>-
>- @retval EFI_SUCCESS Delete User's credential record successfully.
>- @retval Others Fail to add or delete record.
>-
>-**/
>-EFI_STATUS
>-DeleteUserOnProvider (
>- IN EFI_USER_INFO_IDENTITY_POLICY *Identity,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- UINTN Index;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>-
>- //
>- // Find the specified credential provider.
>- //
>- for (Index = 0; Index < mProviderInfo->Count; Index++) {
>- UserCredential = mProviderInfo->Provider[Index];
>- if (CompareGuid ((EFI_GUID *)(Identity + 1), &UserCredential->Identifier))
>{
>- return UserCredential->Delete (UserCredential, User);
>- }
>- }
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Delete User's credental from all the providers that exist in User's identity
>policy.
>-
>- @param[in] IdentityPolicy Point to User's identity policy.
>- @param[in] IdentityPolicyLen The length of the identity policy.
>- @param[in] User Points to user profile.
>-
>-**/
>-VOID
>-DeleteCredentialFromProviders (
>- IN UINT8 *IdentityPolicy,
>- IN UINTN IdentityPolicyLen,
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- UINTN Offset;
>-
>- Offset = 0;
>- while (Offset < IdentityPolicyLen) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (IdentityPolicy + Offset);
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {
>- //
>- // Delete the user on this provider.
>- //
>- DeleteUserOnProvider (Identity, User);
>- }
>- Offset += Identity->Length;
>- }
>-
>-}
>-
>-
>-/**
>- Remove the provider specified by Offset from the new user identification
>record.
>-
>- @param[in] IdentityPolicy Point to user identity item in new identification
>policy.
>- @param[in] Offset The item offset in the new identification policy.
>-
>-**/
>-VOID
>-DeleteProviderFromPolicy (
>- IN EFI_USER_INFO_IDENTITY_POLICY *IdentityPolicy,
>- IN UINTN Offset
>- )
>-{
>- UINTN RemainingLen;
>- UINTN DeleteLen;
>-
>- if (IdentityPolicy->Length == mUserInfo.NewIdentityPolicyLen) {
>- //
>- // Only one credential provider in the identification policy.
>- // Set the new policy to be TRUE after removed the provider.
>- //
>- IdentityPolicy->Type = EFI_USER_INFO_IDENTITY_TRUE;
>- IdentityPolicy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- mUserInfo.NewIdentityPolicyLen = IdentityPolicy->Length;
>- return ;
>- }
>-
>- DeleteLen = IdentityPolicy->Length +
>sizeof(EFI_USER_INFO_IDENTITY_POLICY);
>- if ((Offset + IdentityPolicy->Length) != mUserInfo.NewIdentityPolicyLen) {
>- //
>- // This provider is not the last item in the identification policy, delete it and
>the connector.
>- //
>- RemainingLen = mUserInfo.NewIdentityPolicyLen - Offset - DeleteLen;
>- CopyMem ((UINT8 *) IdentityPolicy, (UINT8 *) IdentityPolicy + DeleteLen,
>RemainingLen);
>- }
>- mUserInfo.NewIdentityPolicyLen -= DeleteLen;
>-}
>-
>-
>-/**
>- Add a new provider to the mUserInfo.NewIdentityPolicy.
>-
>- It is invoked when 'add option' in UI is pressed.
>-
>- @param[in] NewGuid Points to the credential provider guid.
>-
>-**/
>-VOID
>-AddProviderToPolicy (
>- IN EFI_GUID *NewGuid
>- )
>-{
>- UINT8 *NewPolicyInfo;
>- UINTN NewPolicyInfoLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Policy;
>-
>- //
>- // Allocate memory for the new identity policy.
>- //
>- NewPolicyInfoLen = mUserInfo.NewIdentityPolicyLen + sizeof
>(EFI_USER_INFO_IDENTITY_POLICY) + sizeof (EFI_GUID);
>- if (mUserInfo.NewIdentityPolicyLen > 0) {
>- //
>- // It is not the first provider in the policy. Add a connector before provider.
>- //
>- NewPolicyInfoLen += sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- }
>- NewPolicyInfo = AllocateZeroPool (NewPolicyInfoLen);
>- if (NewPolicyInfo == NULL) {
>- return ;
>- }
>-
>- NewPolicyInfoLen = 0;
>- if (mUserInfo.NewIdentityPolicyLen > 0) {
>- //
>- // Save orginal policy.
>- //
>- CopyMem (NewPolicyInfo, mUserInfo.NewIdentityPolicy,
>mUserInfo.NewIdentityPolicyLen);
>-
>- //
>- // Save logical connector.
>- //
>- Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewPolicyInfo +
>mUserInfo.NewIdentityPolicyLen);
>- if (mConncetLogical == 0) {
>- Policy->Type = EFI_USER_INFO_IDENTITY_AND;
>- } else {
>- Policy->Type = EFI_USER_INFO_IDENTITY_OR;
>- }
>-
>- Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>- NewPolicyInfoLen = mUserInfo.NewIdentityPolicyLen + Policy->Length;
>- FreePool (mUserInfo.NewIdentityPolicy);
>- }
>-
>- //
>- // Save credential provider.
>- //
>- Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewPolicyInfo +
>NewPolicyInfoLen);
>- Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY) + sizeof
>(EFI_GUID);
>- Policy->Type = EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER;
>- CopyGuid ((EFI_GUID *) (Policy + 1), NewGuid);
>- NewPolicyInfoLen += Policy->Length;
>-
>- //
>- // Update identity policy choice.
>- //
>- mUserInfo.NewIdentityPolicy = NewPolicyInfo;
>- mUserInfo.NewIdentityPolicyLen = NewPolicyInfoLen;
>- mUserInfo.NewIdentityPolicyModified = TRUE;
>-}
>-
>-
>-/**
>- This function replaces the old identity policy with a new identity policy.
>-
>- This function delete the user identity policy information.
>- If enroll new credential failed, recover the old identity policy.
>-
>- @retval EFI_SUCCESS Modify user identity policy successfully.
>- @retval Others Fail to modify user identity policy.
>-
>-**/
>-EFI_STATUS
>-UpdateCredentialProvider (
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- UINTN Offset;
>-
>- //
>- // Delete the old identification policy.
>- //
>- DeleteCredentialFromProviders (mUserInfo.IdentityPolicy,
>mUserInfo.IdentityPolicyLen, mModifyUser);
>-
>- //
>- // Add the new identification policy.
>- //
>- Offset = 0;
>- while (Offset < mUserInfo.NewIdentityPolicyLen) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *)
>(mUserInfo.NewIdentityPolicy + Offset);
>- if (Identity->Type == EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER) {
>- //
>- // Enroll the user on this provider
>- //
>- Status = EnrollUserOnProvider (Identity, mModifyUser);
>- if (EFI_ERROR (Status)) {
>- //
>- // Failed to enroll the user by new identification policy.
>- // So removed the credential provider from the identification policy
>- //
>- DeleteProviderFromPolicy (Identity, Offset);
>- continue;
>- }
>- }
>- Offset += Identity->Length;
>- }
>-
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Check whether the identity policy is valid.
>-
>- @param[in] PolicyInfo Point to the identity policy.
>- @param[in] PolicyInfoLen The policy length.
>-
>- @retval TRUE The policy is a valid identity policy.
>- @retval FALSE The policy is not a valid identity policy.
>-
>-**/
>-BOOLEAN
>-CheckNewIdentityPolicy (
>- IN UINT8 *PolicyInfo,
>- IN UINTN PolicyInfoLen
>- )
>-{
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- EFI_INPUT_KEY Key;
>- UINTN Offset;
>- UINT32 OpCode;
>-
>- //
>- // Check policy expression.
>- //
>- OpCode = EFI_USER_INFO_IDENTITY_FALSE;
>- Offset = 0;
>- while (Offset < PolicyInfoLen) {
>- //
>- // Check identification policy according to type
>- //
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (PolicyInfo + Offset);
>- switch (Identity->Type) {
>-
>- case EFI_USER_INFO_IDENTITY_TRUE:
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_OR:
>- if (OpCode == EFI_USER_INFO_IDENTITY_AND) {
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Invalid Identity Policy, Mixed Connector Unsupport!",
>- L"",
>- L"Press Any Key to Continue ...",
>- NULL
>- );
>- return FALSE;
>- }
>-
>- OpCode = EFI_USER_INFO_IDENTITY_OR;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_AND:
>- if (OpCode == EFI_USER_INFO_IDENTITY_OR) {
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Invalid Identity Policy, Mixed Connector Unsupport!",
>- L"",
>- L"Press Any Key to Continue ...",
>- NULL
>- );
>- return FALSE;
>- }
>-
>- OpCode = EFI_USER_INFO_IDENTITY_AND;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
>- break;
>-
>- default:
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Unsupport parameter",
>- L"",
>- L"Press Any Key to Continue ...",
>- NULL
>- );
>- return FALSE;
>- }
>- Offset += Identity->Length;
>- }
>-
>- return TRUE;
>-}
>-
>-
>-/**
>- Save the identity policy and update UI with it.
>-
>- This function will verify the new identity policy, in current implementation,
>- the identity policy can be: T, P & P & P & ..., P | P | P | ...
>- Here, "T" means "True", "P" means "Credential Provider", "&" means "and",
>"|" means "or".
>- Other identity policies are not supported.
>-
>-**/
>-VOID
>-SaveIdentityPolicy (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>-
>- if (!mUserInfo.NewIdentityPolicyModified ||
>(mUserInfo.NewIdentityPolicyLen == 0)) {
>- return;
>- }
>-
>- //
>- // Check policy expression.
>- //
>- if (!CheckNewIdentityPolicy (mUserInfo.NewIdentityPolicy,
>mUserInfo.NewIdentityPolicyLen)) {
>- return;
>- }
>-
>- Status = FindInfoByType (mModifyUser,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>-
>- //
>- // Update the informantion on credential provider.
>- //
>- Status = UpdateCredentialProvider ();
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>-
>- //
>- // Save new identification policy.
>- //
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) +
>mUserInfo.NewIdentityPolicyLen);
>- ASSERT (Info != NULL);
>-
>- Info->InfoType = EFI_USER_INFO_IDENTITY_POLICY_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) +
>mUserInfo.NewIdentityPolicyLen);
>- CopyMem ((UINT8 *) (Info + 1), mUserInfo.NewIdentityPolicy,
>mUserInfo.NewIdentityPolicyLen);
>-
>- Status = mUserManager->SetInfo (mUserManager, mModifyUser,
>&UserInfo, Info, Info->InfoSize);
>- FreePool (Info);
>-
>- //
>- // Update the mUserInfo.IdentityPolicy by mUserInfo.NewIdentityPolicy
>- //
>- if (mUserInfo.IdentityPolicy != NULL) {
>- FreePool (mUserInfo.IdentityPolicy);
>- }
>- mUserInfo.IdentityPolicy = mUserInfo.NewIdentityPolicy;
>- mUserInfo.IdentityPolicyLen = mUserInfo.NewIdentityPolicyLen;
>-
>- mUserInfo.NewIdentityPolicy = NULL;
>- mUserInfo.NewIdentityPolicyLen = 0;
>- mUserInfo.NewIdentityPolicyModified = FALSE;
>-
>- //
>- // Update identity policy choice.
>- //
>- ResolveIdentityPolicy (mUserInfo.IdentityPolicy,
>mUserInfo.IdentityPolicyLen, STRING_TOKEN (STR_IDENTIFY_POLICY_VAL));
>-}
>-
>-
>-/**
>- Update the mUserInfo.NewIdentityPolicy, and UI when 'add option' is
>pressed.
>-
>-**/
>-VOID
>-AddIdentityPolicyItem (
>- VOID
>- )
>-{
>- if (mProviderInfo->Count == 0) {
>- return ;
>- }
>-
>- //
>- // Check the identity policy.
>- //
>- if (ProviderAlreadyInPolicy (&mProviderInfo->Provider[mProviderChoice]-
>>Identifier)) {
>- return;
>- }
>-
>- //
>- // Add it to identification policy
>- //
>- AddProviderToPolicy (&mProviderInfo->Provider[mProviderChoice]-
>>Identifier);
>-
>- //
>- // Update identity policy choice.
>- //
>- ResolveIdentityPolicy (mUserInfo.NewIdentityPolicy,
>mUserInfo.NewIdentityPolicyLen, STRING_TOKEN
>(STR_IDENTIFY_POLICY_VALUE));
>-}
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
>deleted file mode 100644
>index 6de7e75e79..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileAdd.c
>+++ /dev/null
>@@ -1,372 +0,0 @@
>-/** @file
>- The functions to add a user profile.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-
>-/**
>- Get user name from the popup windows.
>-
>- @param[in, out] UserNameLen On entry, point to UserName buffer lengh,
>in bytes.
>- On exit, point to input user name length, in bytes.
>- @param[out] UserName The buffer to hold the input user name.
>-
>- @retval EFI_ABORTED It is given up by pressing 'ESC' key.
>- @retval EFI_NOT_READY Not a valid input at all.
>- @retval EFI_SUCCESS Get a user name successfully.
>-
>-**/
>-EFI_STATUS
>-GetUserNameInput (
>- IN OUT UINTN *UserNameLen,
>- OUT CHAR16 *UserName
>- )
>-{
>- EFI_INPUT_KEY Key;
>- UINTN NameLen;
>- CHAR16 Name[USER_NAME_LENGTH];
>-
>- NameLen = 0;
>- while (TRUE) {
>- Name[NameLen] = L'_';
>- Name[NameLen + 1] = L'\0';
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Input User Name",
>- L"---------------------",
>- Name,
>- NULL
>- );
>- //
>- // Check key.
>- //
>- if (Key.ScanCode == SCAN_NULL) {
>- if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
>- //
>- // Add the null terminator.
>- //
>- Name[NameLen] = 0;
>- NameLen++;
>- break;
>- } else if ((Key.UnicodeChar == CHAR_NULL) ||
>- (Key.UnicodeChar == CHAR_TAB) ||
>- (Key.UnicodeChar == CHAR_LINEFEED)
>- ) {
>- continue;
>- } else {
>- if (Key.UnicodeChar == CHAR_BACKSPACE) {
>- if (NameLen > 0) {
>- NameLen--;
>- }
>- } else {
>- Name[NameLen] = Key.UnicodeChar;
>- NameLen++;
>- if (NameLen + 1 == USER_NAME_LENGTH) {
>- //
>- // Add the null terminator.
>- //
>- Name[NameLen] = 0;
>- NameLen++;
>- break;
>- }
>- }
>- }
>- }
>-
>- if (Key.ScanCode == SCAN_ESC) {
>- return EFI_ABORTED;
>- }
>- }
>-
>- if (NameLen <= 1) {
>- return EFI_NOT_READY;
>- }
>-
>- if (*UserNameLen < NameLen * sizeof (CHAR16)) {
>- return EFI_NOT_READY;
>- }
>-
>- *UserNameLen = NameLen * sizeof (CHAR16);
>- CopyMem (UserName, Name, *UserNameLen);
>-
>- return EFI_SUCCESS;
>-}
>-
>-/**
>- Set a user's username.
>-
>- @param[in] User Handle of a user profile .
>- @param[in] UserNameLen The lengh of UserName.
>- @param[in] UserName Point to the buffer of user name.
>-
>- @retval EFI_NOT_READY The usernme in mAddUserName had been used.
>- @retval EFI_SUCCESS Change the user's username successfully with
>- username in mAddUserName.
>-
>-**/
>-EFI_STATUS
>-SetUserName (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINTN UserNameLen,
>- IN CHAR16 *UserName
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_PROFILE_HANDLE TempUser;
>- EFI_USER_INFO *NewUserInfo;
>-
>- NewUserInfo = AllocateZeroPool (sizeof (EFI_USER_INFO) + UserNameLen);
>- ASSERT (NewUserInfo != NULL);
>-
>- NewUserInfo->InfoType = EFI_USER_INFO_NAME_RECORD;
>- NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- NewUserInfo->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) +
>UserNameLen);
>- CopyMem ((UINT8 *) (NewUserInfo + 1), UserName, UserNameLen);
>- TempUser = NULL;
>- Status = mUserManager->Find (
>- mUserManager,
>- &TempUser,
>- NULL,
>- NewUserInfo,
>- NewUserInfo->InfoSize
>- );
>- if (!EFI_ERROR (Status)) {
>- //
>- // The user name had been used, return error.
>- //
>- FreePool (NewUserInfo);
>- return EFI_NOT_READY;
>- }
>-
>- UserInfo = NULL;
>- mUserManager->SetInfo (
>- mUserManager,
>- User,
>- &UserInfo,
>- NewUserInfo,
>- NewUserInfo->InfoSize
>- );
>- FreePool (NewUserInfo);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- Set create date of the specified user.
>-
>- @param[in] User Handle of a user profile.
>-
>-**/
>-VOID
>-SetCreateDate (
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO_CREATE_DATE Date;
>- EFI_USER_INFO *NewUserInfo;
>-
>- NewUserInfo = AllocateZeroPool (
>- sizeof (EFI_USER_INFO) +
>- sizeof (EFI_USER_INFO_CREATE_DATE)
>- );
>- ASSERT (NewUserInfo != NULL);
>-
>- NewUserInfo->InfoType = EFI_USER_INFO_CREATE_DATE_RECORD;
>- NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + sizeof
>(EFI_USER_INFO_CREATE_DATE);
>- Status = gRT->GetTime (&Date, NULL);
>- if (EFI_ERROR (Status)) {
>- FreePool (NewUserInfo);
>- return ;
>- }
>-
>- CopyMem ((UINT8 *) (NewUserInfo + 1), &Date, sizeof
>(EFI_USER_INFO_CREATE_DATE));
>- UserInfo = NULL;
>- mUserManager->SetInfo (
>- mUserManager,
>- User,
>- &UserInfo,
>- NewUserInfo,
>- NewUserInfo->InfoSize
>- );
>- FreePool (NewUserInfo);
>-}
>-
>-
>-/**
>- Set the default identity policy of the specified user.
>-
>- @param[in] User Handle of a user profile.
>-
>-**/
>-VOID
>-SetIdentityPolicy (
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_USER_INFO_IDENTITY_POLICY *Policy;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *NewUserInfo;
>-
>- NewUserInfo = AllocateZeroPool (
>- sizeof (EFI_USER_INFO) +
>- sizeof (EFI_USER_INFO_IDENTITY_POLICY)
>- );
>- ASSERT (NewUserInfo != NULL);
>-
>- Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (NewUserInfo + 1);
>- Policy->Type = EFI_USER_INFO_IDENTITY_TRUE;
>- Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
>-
>- NewUserInfo->InfoType = EFI_USER_INFO_IDENTITY_POLICY_RECORD;
>- NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + Policy->Length;
>- UserInfo = NULL;
>- mUserManager->SetInfo (
>- mUserManager,
>- User,
>- &UserInfo,
>- NewUserInfo,
>- NewUserInfo->InfoSize
>- );
>- FreePool (NewUserInfo);
>-}
>-
>-
>-/**
>- Set the default access policy of the specified user.
>-
>- @param[in] User Handle of a user profile.
>-
>-**/
>-VOID
>-SetAccessPolicy (
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_USER_INFO_ACCESS_CONTROL *Control;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *NewUserInfo;
>-
>- NewUserInfo = AllocateZeroPool (
>- sizeof (EFI_USER_INFO) +
>- sizeof (EFI_USER_INFO_ACCESS_CONTROL)
>- );
>- ASSERT (NewUserInfo != NULL);
>-
>- Control = (EFI_USER_INFO_ACCESS_CONTROL *) (NewUserInfo +
>1);
>- Control->Type = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- Control->Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
>-
>- NewUserInfo->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD;
>- NewUserInfo->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- NewUserInfo->InfoSize = sizeof (EFI_USER_INFO) + Control->Size;
>- UserInfo = NULL;
>- mUserManager->SetInfo (
>- mUserManager,
>- User,
>- &UserInfo,
>- NewUserInfo,
>- NewUserInfo->InfoSize
>- );
>- FreePool (NewUserInfo);
>-}
>-
>-
>-/**
>- Add a new user profile into the user profile database.
>-
>-**/
>-VOID
>-CallAddUser (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- EFI_INPUT_KEY Key;
>- EFI_USER_PROFILE_HANDLE User;
>- UINTN UserNameLen;
>- CHAR16 UserName[USER_NAME_LENGTH];
>- CHAR16 *QuestionStr;
>- CHAR16 *PromptStr;
>-
>- QuestionStr = NULL;
>- PromptStr = NULL;
>-
>- //
>- // Get user name to add.
>- //
>- UserNameLen = sizeof (UserName);
>- Status = GetUserNameInput (&UserNameLen, UserName);
>- if (EFI_ERROR (Status)) {
>- if (Status != EFI_ABORTED) {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_GET_USERNAME_FAILED));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_STROKE_KEY_CONTINUE));
>- goto Done;
>- }
>- return ;
>- }
>-
>- //
>- // Create a new user profile.
>- //
>- User = NULL;
>- Status = mUserManager->Create (mUserManager, &User);
>- if (EFI_ERROR (Status)) {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_CREATE_PROFILE_FAILED));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_STROKE_KEY_CONTINUE));
>- } else {
>- //
>- // Add default user information.
>- //
>- Status = SetUserName (User, UserNameLen, UserName);
>- if (EFI_ERROR (Status)) {
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_USER_ALREADY_EXISTED));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_STROKE_KEY_CONTINUE));
>- goto Done;
>- }
>-
>- SetCreateDate (User);
>- SetIdentityPolicy (User);
>- SetAccessPolicy (User);
>-
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_CREATE_PROFILE_SUCCESS));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_STROKE_KEY_CONTINUE));
>- }
>-
>-Done:
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>-}
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.
>c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.
>c
>deleted file mode 100644
>index af5d3109dd..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileDelete.
>c
>+++ /dev/null
>@@ -1,343 +0,0 @@
>-/** @file
>- The functions to delete a user profile.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-/**
>- Get the username from the specified user.
>-
>- @param[in] User Handle of a user profile.
>-
>- @retval EFI_STRING_ID The String Id of the user's username.
>-
>-**/
>-EFI_STRING_ID
>-GetUserName (
>- IN EFI_USER_PROFILE_HANDLE User
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>- UINTN InfoSize;
>- UINTN MemSize;
>- UINTN NameLen;
>- CHAR16 UserName[USER_NAME_LENGTH];
>- EFI_STRING_ID UserId;
>-
>- //
>- // Allocate user information memory.
>- //
>- MemSize = sizeof (EFI_USER_INFO) + 63;
>- Info = AllocateZeroPool (MemSize);
>- ASSERT (Info != NULL);
>-
>- //
>- // Get user name information.
>- //
>- UserInfo = NULL;
>- while (TRUE) {
>- InfoSize = MemSize;
>- //
>- // Get next user information.
>- //
>- Status = mUserManager->GetNextInfo (
>- mUserManager,
>- User,
>- &UserInfo
>- );
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- User,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- MemSize = InfoSize;
>- FreePool (Info);
>- Info = AllocateZeroPool (MemSize);
>- ASSERT (Info != NULL);
>-
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- User,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- }
>- //
>- // Check user information.
>- //
>- if (Status == EFI_SUCCESS) {
>- if (Info->InfoType == EFI_USER_INFO_NAME_RECORD) {
>- NameLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- if (NameLen > USER_NAME_LENGTH * sizeof (CHAR16)) {
>- NameLen = USER_NAME_LENGTH * sizeof (CHAR16);
>- }
>- ASSERT (NameLen >= sizeof (CHAR16));
>- CopyMem (UserName, (UINT8 *) (Info + 1), NameLen);
>- UserName[NameLen / sizeof (CHAR16) - 1] = 0;
>- UserId = HiiSetString (
>- mCallbackInfo->HiiHandle,
>- 0,
>- UserName,
>- NULL
>- );
>- if (UserId != 0) {
>- FreePool (Info);
>- return UserId;
>- }
>- }
>- }
>- }
>-
>- FreePool (Info);
>- return 0;
>-}
>-
>-
>-/**
>- Add a username item in form.
>-
>- @param[in] User Points to the user profile whose username is added.
>- @param[in] Index The index of the user in the user name list
>- @param[in] OpCodeHandle Points to container for dynamic created
>opcodes.
>-
>-**/
>-VOID
>-AddUserToForm (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT16 Index,
>- IN VOID *OpCodeHandle
>- )
>-{
>- EFI_STRING_ID NameId;
>-
>- //
>- // Get user name
>- //
>- NameId = GetUserName (User);
>- if (NameId == 0) {
>- return ;
>- }
>-
>- //
>- // Create user name option.
>- //
>- switch (Index & KEY_FIRST_FORM_MASK) {
>- case KEY_MODIFY_USER:
>- HiiCreateGotoOpCode (
>- OpCodeHandle, // Container for dynamic created opcodes
>- FORMID_USER_INFO, // Target Form ID
>- NameId, // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- Index // Question ID
>- );
>- break;
>-
>- case KEY_DEL_USER:
>- HiiCreateActionOpCode (
>- OpCodeHandle, // Container for dynamic created opcodes
>- Index, // Question ID
>- NameId, // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- 0 // Action String ID
>- );
>- break;
>-
>- default:
>- break;
>- }
>-}
>-
>-
>-/**
>- Delete the user specified by UserIndex in user profile database.
>-
>- @param[in] UserIndex The index of user in the user name list
>- to be deleted.
>-
>-**/
>-VOID
>-DeleteUser (
>- IN UINT8 UserIndex
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_PROFILE_HANDLE User;
>- EFI_INPUT_KEY Key;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>- UINTN InfoSize;
>-
>- //
>- // Find specified user profile and delete it.
>- //
>- User = NULL;
>- Status = mUserManager->GetNext (mUserManager, &User);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- while (UserIndex > 1) {
>- Status = mUserManager->GetNext (mUserManager, &User);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>- UserIndex--;
>- }
>-
>- if (UserIndex == 1) {
>- //
>- // Get the identification policy.
>- //
>- Status = FindInfoByType (User,
>EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>-
>- InfoSize = 0;
>- Info = NULL;
>- Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info,
>&InfoSize);
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- Info = AllocateZeroPool (InfoSize);
>- if (Info == NULL) {
>- goto Done;
>- }
>- Status = mUserManager->GetInfo (mUserManager, User, UserInfo, Info,
>&InfoSize);
>- }
>-
>- //
>- // Delete the user on the credential providers by its identification policy.
>- //
>- ASSERT (Info != NULL);
>- DeleteCredentialFromProviders ((UINT8 *)(Info + 1), Info->InfoSize - sizeof
>(EFI_USER_INFO), User);
>- FreePool (Info);
>-
>- Status = mUserManager->Delete (mUserManager, User);
>- if (EFI_ERROR (Status)) {
>- goto Done;
>- }
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Delete User Succeed!",
>- L"",
>- L"Please Press Any Key to Continue ...",
>- NULL
>- );
>- return ;
>- }
>-
>-Done:
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Delete User Failed!",
>- L"",
>- L"Please Press Any Key to Continue ...",
>- NULL
>- );
>-}
>-
>-
>-/**
>- Display user select form, cab select a user to delete.
>-
>-**/
>-VOID
>-SelectUserToDelete (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 Index;
>- EFI_USER_PROFILE_HANDLE User;
>- EFI_USER_PROFILE_HANDLE CurrentUser;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_USER_DEL_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add each user can be deleted.
>- //
>- User = NULL;
>- Index = 1;
>- mUserManager->Current (mUserManager, &CurrentUser);
>- while (TRUE) {
>- Status = mUserManager->GetNext (mUserManager, &User);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- if (User != CurrentUser) {
>- AddUserToForm (
>- User,
>- (UINT16)(KEY_DEL_USER | KEY_SELECT_USER | Index),
>- StartOpCodeHandle
>- );
>- }
>- Index++;
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_DEL_USER, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.c
>deleted file mode 100644
>index e73ba3a8fc..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.c
>+++ /dev/null
>@@ -1,887 +0,0 @@
>-/** @file
>- This driver is a configuration tool for adding, deleting or modifying user
>- profiles, including gathering the necessary information to ascertain their
>- identity in the future, updating user access policy and identification
>- policy, etc.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-EFI_USER_MANAGER_PROTOCOL *mUserManager = NULL;
>-CREDENTIAL_PROVIDER_INFO *mProviderInfo = NULL;
>-UINT8 mProviderChoice;
>-UINT8 mConncetLogical;
>-USER_INFO_ACCESS mAccessInfo;
>-USER_INFO mUserInfo;
>-USER_PROFILE_MANAGER_CALLBACK_INFO *mCallbackInfo;
>-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
>- {
>- {
>- HARDWARE_DEVICE_PATH,
>- HW_VENDOR_DP,
>- {
>- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
>- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
>- }
>- },
>- USER_PROFILE_MANAGER_GUID
>- },
>- {
>- END_DEVICE_PATH_TYPE,
>- END_ENTIRE_DEVICE_PATH_SUBTYPE,
>- {
>- (UINT8) (END_DEVICE_PATH_LENGTH),
>- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
>- }
>- }
>-};
>-
>-
>-/**
>- Get string by string id from HII Interface.
>-
>-
>- @param[in] Id String ID to get the string from.
>-
>- @retval CHAR16 * String from ID.
>- @retval NULL If error occurs.
>-
>-**/
>-CHAR16 *
>-GetStringById (
>- IN EFI_STRING_ID Id
>- )
>-{
>- //
>- // Get the current string for the current Language.
>- //
>- return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL);
>-}
>-
>-
>-/**
>- This function gets all the credential providers in the system and saved them
>- to mProviderInfo.
>-
>- @retval EFI_SUCESS Init credential provider database successfully.
>- @retval Others Fail to init credential provider database.
>-
>-**/
>-EFI_STATUS
>-InitProviderInfo (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINTN HandleCount;
>- EFI_HANDLE *HandleBuf;
>- UINTN Index;
>-
>- //
>- // Try to find all the user credential provider driver.
>- //
>- HandleCount = 0;
>- HandleBuf = NULL;
>- Status = gBS->LocateHandleBuffer (
>- ByProtocol,
>- &gEfiUserCredential2ProtocolGuid,
>- NULL,
>- &HandleCount,
>- &HandleBuf
>- );
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Get provider infomation.
>- //
>- if (mProviderInfo != NULL) {
>- FreePool (mProviderInfo);
>- }
>- mProviderInfo = AllocateZeroPool (
>- sizeof (CREDENTIAL_PROVIDER_INFO) -
>- sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *) +
>- HandleCount * sizeof (EFI_USER_CREDENTIAL2_PROTOCOL *)
>- );
>- if (mProviderInfo == NULL) {
>- FreePool (HandleBuf);
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- mProviderInfo->Count = HandleCount;
>- for (Index = 0; Index < HandleCount; Index++) {
>- Status = gBS->HandleProtocol (
>- HandleBuf[Index],
>- &gEfiUserCredential2ProtocolGuid,
>- (VOID **) &mProviderInfo->Provider[Index]
>- );
>- if (EFI_ERROR (Status)) {
>- FreePool (HandleBuf);
>- FreePool (mProviderInfo);
>- mProviderInfo = NULL;
>- return Status;
>- }
>- }
>-
>- FreePool (HandleBuf);
>- return EFI_SUCCESS;
>-}
>-
>-
>-/**
>- This function processes changes in user profile configuration.
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Action Specifies the type of action taken by the browser.
>- @param QuestionId A unique value which is sent to the original
>- exporting driver so that it can identify the type
>- of data to expect.
>- @param Type The type of value for the question.
>- @param Value A pointer to the data being sent to the original
>- exporting driver.
>- @param ActionRequest On return, points to the action requested by
>the
>- callback function.
>-
>- @retval EFI_SUCCESS The callback successfully handled the action.
>- @retval Others Fail to handle the action.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileManagerCallback (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN EFI_BROWSER_ACTION Action,
>- IN EFI_QUESTION_ID QuestionId,
>- IN UINT8 Type,
>- IN EFI_IFR_TYPE_VALUE *Value,
>- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
>- )
>-{
>- EFI_STATUS Status;
>- EFI_INPUT_KEY Key;
>- UINT32 CurrentAccessRight;
>- CHAR16 *QuestionStr;
>- CHAR16 *PromptStr;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>- EFI_USER_PROFILE_HANDLE CurrentUser;
>-
>- Status = EFI_SUCCESS;
>-
>- switch (Action) {
>- case EFI_BROWSER_ACTION_FORM_OPEN:
>- {
>- //
>- // Update user manage Form when user manage Form is opened.
>- // This will be done only in FORM_OPEN CallBack of question with
>QUESTIONID_USER_MANAGE from user manage Form.
>- //
>- if (QuestionId != QUESTIONID_USER_MANAGE) {
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Get current user
>- //
>- CurrentUser = NULL;
>- mUserManager->Current (mUserManager, &CurrentUser);
>- if (CurrentUser == NULL) {
>- DEBUG ((DEBUG_ERROR, "Error: current user does not exist!\n"));
>- return EFI_NOT_READY;
>- }
>-
>- //
>- // Get current user's right information.
>- //
>- Status = GetAccessRight (&CurrentAccessRight);
>- if (EFI_ERROR (Status)) {
>- CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- }
>-
>- //
>- // Init credential provider information.
>- //
>- Status = InitProviderInfo ();
>- if (EFI_ERROR (Status)) {
>- return Status;
>- }
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_USER_MANAGE_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add user profile option.
>- //
>- if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) ||
>- (CurrentAccessRight == EFI_USER_INFO_ACCESS_ENROLL_OTHERS)
>- ) {
>- HiiCreateActionOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_ADD_USER, // Question ID
>- STRING_TOKEN (STR_ADD_USER_TITLE), // Prompt text
>- STRING_TOKEN (STR_ADD_USER_HELP), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- 0 // Action String ID
>- );
>- }
>-
>- //
>- // Add modify user profile option.
>- //
>- HiiCreateGotoOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- FORMID_MODIFY_USER, // Target Form ID
>- STRING_TOKEN (STR_MODIFY_USER_TITLE), // Prompt text
>- STRING_TOKEN (STR_MODIFY_USER_HELP), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- KEY_MODIFY_USER // Question ID
>- );
>-
>- //
>- // Add delete user profile option
>- //
>- if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) {
>- HiiCreateGotoOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- FORMID_DEL_USER, // Target Form ID
>- STRING_TOKEN (STR_DELETE_USER_TITLE), // Prompt text
>- STRING_TOKEN (STR_DELETE_USER_HELP), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- KEY_DEL_USER // Question ID
>- );
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_USER_MANAGE, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-
>- return EFI_SUCCESS;
>- }
>- break;
>-
>- case EFI_BROWSER_ACTION_FORM_CLOSE:
>- Status = EFI_SUCCESS;
>- break;
>-
>- case EFI_BROWSER_ACTION_CHANGED:
>- {
>- //
>- // Handle the request from form.
>- //
>- if ((Value == NULL) || (ActionRequest == NULL)) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Judge first 2 bits.
>- //
>- switch (QuestionId & KEY_FIRST_FORM_MASK) {
>- //
>- // Add user profile operation.
>- //
>- case KEY_ADD_USER:
>- CallAddUser ();
>- break;
>-
>- //
>- // Delete user profile operation.
>- //
>- case KEY_DEL_USER:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_SECOND_FORM_MASK) {
>- //
>- // Delete specified user profile.
>- //
>- case KEY_SELECT_USER:
>- DeleteUser ((UINT8) QuestionId);
>- //
>- // Update select user form after delete a user.
>- //
>- SelectUserToDelete ();
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Modify user profile operation.
>- //
>- case KEY_MODIFY_USER:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_SECOND_FORM_MASK) {
>- //
>- // Enter user profile information form.
>- //
>- case KEY_SELECT_USER:
>- //
>- // Judge next 3 bits.
>- //
>- switch (QuestionId & KEY_MODIFY_INFO_MASK) {
>- //
>- // Modify user name.
>- //
>- case KEY_MODIFY_NAME:
>- ModifyUserName ();
>- //
>- // Update username in parent form.
>- //
>- SelectUserToModify ();
>- break;
>-
>- //
>- // Modify identity policy.
>- //
>- case KEY_MODIFY_IP:
>- //
>- // Judge next 3 bits
>- //
>- switch (QuestionId & KEY_MODIFY_IP_MASK) {
>- //
>- // Change credential provider option.
>- //
>- case KEY_MODIFY_PROV:
>- mProviderChoice = Value->u8;
>- break;
>-
>- //
>- // Change logical connector.
>- //
>- case KEY_MODIFY_CONN:
>- mConncetLogical = Value->u8;
>- break;
>-
>- //
>- // Save option.
>- //
>- case KEY_ADD_IP_OP:
>- AddIdentityPolicyItem ();
>- break;
>-
>- //
>- // Return to user profile information form.
>- //
>- case KEY_IP_RETURN_UIF:
>- SaveIdentityPolicy ();
>- *ActionRequest =
>EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Modify access policy.
>- //
>- case KEY_MODIFY_AP:
>- //
>- // Judge next 3 bits.
>- //
>- switch (QuestionId & KEY_MODIFY_AP_MASK) {
>- //
>- // Change access right choice.
>- //
>- case KEY_MODIFY_RIGHT:
>- mAccessInfo.AccessRight = Value->u8;
>- break;
>-
>- //
>- // Change setup choice.
>- //
>- case KEY_MODIFY_SETUP:
>- mAccessInfo.AccessSetup= Value->u8;
>- break;
>-
>- //
>- // Change boot order choice.
>- //
>- case KEY_MODIFY_BOOT:
>- mAccessInfo.AccessBootOrder = Value->u32;
>- break;
>-
>- //
>- // Return to user profile information form.
>- //
>- case KEY_AP_RETURN_UIF:
>- SaveAccessPolicy ();
>- *ActionRequest =
>EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Access policy device path modified.
>- //
>- case KEY_MODIFY_AP_DP:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_MODIFY_DP_MASK) {
>- //
>- // Load permit device path modified.
>- //
>- case KEY_LOAD_PERMIT_MODIFY:
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_MOVE_TO_FORBID_LIST));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_PRESS_KEY_CONTINUE));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>- if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) {
>- break;
>- }
>-
>- AddToForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK -
>1)));
>- DisplayLoadPermit ();
>- break;
>-
>- //
>- // Load forbid device path modified.
>- //
>- case KEY_LOAD_FORBID_MODIFY:
>- QuestionStr = GetStringById (STRING_TOKEN
>(STR_MOVE_TO_PERMIT_LIST));
>- PromptStr = GetStringById (STRING_TOKEN
>(STR_PRESS_KEY_CONTINUE));
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- QuestionStr,
>- L"",
>- PromptStr,
>- NULL
>- );
>- FreePool (QuestionStr);
>- FreePool (PromptStr);
>- if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) {
>- break;
>- }
>-
>- DeleteFromForbidLoad ((UINT16)(QuestionId &
>(KEY_MODIFY_DP_MASK - 1)));
>- DisplayLoadForbid ();
>- break;
>-
>- //
>- // Connect permit device path modified.
>- //
>- case KEY_CONNECT_PERMIT_MODIFY:
>- break;
>-
>- //
>- // Connect forbid device path modified.
>- //
>- case KEY_CONNECT_FORBID_MODIFY:
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- }
>- break;
>-
>-
>- case EFI_BROWSER_ACTION_CHANGING:
>- {
>- //
>- // Handle the request from form.
>- //
>- if (Value == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- //
>- // Judge first 2 bits.
>- //
>- switch (QuestionId & KEY_FIRST_FORM_MASK) {
>- //
>- // Delete user profile operation.
>- //
>- case KEY_DEL_USER:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_SECOND_FORM_MASK) {
>- //
>- // Enter delete user profile form.
>- //
>- case KEY_ENTER_NEXT_FORM:
>- SelectUserToDelete ();
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Modify user profile operation.
>- //
>- case KEY_MODIFY_USER:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_SECOND_FORM_MASK) {
>- //
>- // Enter modify user profile form.
>- //
>- case KEY_ENTER_NEXT_FORM:
>- SelectUserToModify ();
>- break;
>-
>- //
>- // Enter user profile information form.
>- //
>- case KEY_SELECT_USER:
>- //
>- // Judge next 3 bits.
>- //
>- switch (QuestionId & KEY_MODIFY_INFO_MASK) {
>- //
>- // Display user information form.
>- //
>- case KEY_ENTER_NEXT_FORM:
>- ModifyUserInfo ((UINT8) QuestionId);
>- break;
>-
>- //
>- // Modify identity policy.
>- //
>- case KEY_MODIFY_IP:
>- //
>- // Judge next 3 bits
>- //
>- switch (QuestionId & KEY_MODIFY_IP_MASK) {
>- //
>- // Display identity policy modify form.
>- //
>- case KEY_ENTER_NEXT_FORM:
>- ModifyIdentityPolicy ();
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Modify access policy.
>- //
>- case KEY_MODIFY_AP:
>- //
>- // Judge next 3 bits.
>- //
>- switch (QuestionId & KEY_MODIFY_AP_MASK) {
>- //
>- // Display access policy modify form.
>- //
>- case KEY_ENTER_NEXT_FORM:
>- ModidyAccessPolicy ();
>- break;
>- //
>- // Load device path form.
>- //
>- case KEY_MODIFY_LOAD:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_DISPLAY_DP_MASK) {
>- //
>- // Permit load device path.
>- //
>- case KEY_PERMIT_MODIFY:
>- DisplayLoadPermit ();
>- break;
>-
>- //
>- // Forbid load device path.
>- //
>- case KEY_FORBID_MODIFY:
>- DisplayLoadForbid ();
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- //
>- // Connect device path form.
>- //
>- case KEY_MODIFY_CONNECT:
>- //
>- // Judge next 2 bits.
>- //
>- switch (QuestionId & KEY_DISPLAY_DP_MASK) {
>- //
>- // Permit connect device path.
>- //
>- case KEY_PERMIT_MODIFY:
>- DisplayConnectPermit ();
>- break;
>-
>- //
>- // Forbid connect device path.
>- //
>- case KEY_FORBID_MODIFY:
>- DisplayConnectForbid ();
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- break;
>-
>- default:
>- break;
>- }
>- }
>- break;
>-
>- default:
>- //
>- // All other action return unsupported.
>- //
>- Status = EFI_UNSUPPORTED;
>- break;
>- }
>-
>-
>- return Status;
>-}
>-
>-
>-/**
>- This function allows a caller to extract the current configuration for one
>- or more named elements from the target driver.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Request A null-terminated Unicode string in <ConfigRequest>
>format.
>- @param Progress On return, points to a character in the Request string.
>- Points to the string's null terminator if request was successful.
>- Points to the most recent '&' before the first failing name/value
>- pair (or the beginning of the string if the failure is in the
>- first name/value pair) if the request was not successful.
>- @param Results A null-terminated Unicode string in <ConfigAltResp>
>format which
>- has all values filled in for the names in the Request string.
>- String to be allocated by the called function.
>-
>- @retval EFI_SUCCESS The Results is filled with the requested values.
>- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
>results.
>- @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown
>name.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeExtractConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Request,
>- OUT EFI_STRING *Progress,
>- OUT EFI_STRING *Results
>- )
>-{
>- if (Progress == NULL || Results == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>- *Progress = Request;
>- return EFI_NOT_FOUND;
>-}
>-
>-/**
>- This function processes the results of changes in configuration.
>-
>-
>- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>- @param Configuration A null-terminated Unicode string in <ConfigResp>
>format.
>- @param Progress A pointer to a string filled in with the offset of the
>most
>- recent '&' before the first failing name/value pair (or the
>- beginning of the string if the failure is in the first
>- name/value pair) or the terminating NULL if all was successful.
>-
>- @retval EFI_SUCCESS The Results is processed successfully.
>- @retval EFI_INVALID_PARAMETER Configuration is NULL.
>- @retval EFI_NOT_FOUND Routing data doesn't match any storage in
>this driver.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-FakeRouteConfig (
>- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
>- IN CONST EFI_STRING Configuration,
>- OUT EFI_STRING *Progress
>- )
>-{
>- if (Configuration == NULL || Progress == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *Progress = Configuration;
>-
>- return EFI_NOT_FOUND;
>-}
>-
>-
>-/**
>- Main entry for this driver.
>-
>- @param ImageHandle Image handle this driver.
>- @param SystemTable Pointer to SystemTable.
>-
>- @retval EFI_SUCESS This function always complete successfully.
>-
>-**/
>-EFI_STATUS
>-EFIAPI
>-UserProfileManagerInit (
>- IN EFI_HANDLE ImageHandle,
>- IN EFI_SYSTEM_TABLE *SystemTable
>- )
>-{
>- EFI_STATUS Status;
>- USER_PROFILE_MANAGER_CALLBACK_INFO *CallbackInfo;
>-
>- Status = gBS->LocateProtocol (
>- &gEfiUserManagerProtocolGuid,
>- NULL,
>- (VOID **) &mUserManager
>- );
>- if (EFI_ERROR (Status)) {
>- return EFI_SUCCESS;
>- }
>-
>- //
>- // Initialize driver private data.
>- //
>- ZeroMem (&mUserInfo, sizeof (mUserInfo));
>- ZeroMem (&mAccessInfo, sizeof (mAccessInfo));
>-
>- CallbackInfo = AllocateZeroPool (sizeof
>(USER_PROFILE_MANAGER_CALLBACK_INFO));
>- ASSERT (CallbackInfo != NULL);
>-
>- CallbackInfo->Signature = USER_PROFILE_MANAGER_SIGNATURE;
>- CallbackInfo->ConfigAccess.ExtractConfig = FakeExtractConfig;
>- CallbackInfo->ConfigAccess.RouteConfig = FakeRouteConfig;
>- CallbackInfo->ConfigAccess.Callback = UserProfileManagerCallback;
>- CallbackInfo->DriverHandle = NULL;
>-
>- //
>- // Install Device Path Protocol and Config Access protocol to driver handle.
>- //
>- Status = gBS->InstallMultipleProtocolInterfaces (
>- &CallbackInfo->DriverHandle,
>- &gEfiDevicePathProtocolGuid,
>- &mHiiVendorDevicePath,
>- &gEfiHiiConfigAccessProtocolGuid,
>- &CallbackInfo->ConfigAccess,
>- NULL
>- );
>- ASSERT_EFI_ERROR (Status);
>-
>- //
>- // Publish HII data.
>- //
>- CallbackInfo->HiiHandle = HiiAddPackages (
>- &gUserProfileManagerGuid,
>- CallbackInfo->DriverHandle,
>- UserProfileManagerStrings,
>- UserProfileManagerVfrBin,
>- NULL
>- );
>- ASSERT (CallbackInfo->HiiHandle != NULL);
>- mCallbackInfo = CallbackInfo;
>-
>- return Status;
>-}
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.h
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.h
>deleted file mode 100644
>index aff1e28d9d..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.h
>+++ /dev/null
>@@ -1,444 +0,0 @@
>-/** @file
>- The header file for user profile manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef __EFI_USER_PROFILE_MANAGER_H__
>-#define __EFI_USER_PROFILE_MANAGER_H__
>-
>-#include <Uefi.h>
>-
>-#include <Guid/GlobalVariable.h>
>-#include <Guid/MdeModuleHii.h>
>-
>-#include <Protocol/HiiConfigAccess.h>
>-#include <Protocol/UserCredential2.h>
>-#include <Protocol/UserManager.h>
>-
>-#include <Library/UefiRuntimeServicesTableLib.h>
>-#include <Library/UefiBootServicesTableLib.h>
>-#include <Library/MemoryAllocationLib.h>
>-#include <Library/BaseMemoryLib.h>
>-#include <Library/DevicePathLib.h>
>-#include <Library/DebugLib.h>
>-#include <Library/UefiLib.h>
>-#include <Library/PrintLib.h>
>-#include <Library/HiiLib.h>
>-
>-#include "UserProfileManagerData.h"
>-
>-#define USER_NAME_LENGTH 17
>-
>-//
>-// Credential Provider Information.
>-//
>-typedef struct {
>- UINTN Count;
>- EFI_USER_CREDENTIAL2_PROTOCOL *Provider[1];
>-} CREDENTIAL_PROVIDER_INFO;
>-
>-//
>-// User profile information structure.
>-//
>-typedef struct {
>- UINT64 UsageCount;
>- EFI_TIME CreateDate;
>- EFI_TIME UsageDate;
>- UINTN AccessPolicyLen;
>- UINTN IdentityPolicyLen;
>- UINTN NewIdentityPolicyLen;
>- UINT8 *AccessPolicy;
>- UINT8 *IdentityPolicy;
>- UINT8 *NewIdentityPolicy;
>- CHAR16 UserName[USER_NAME_LENGTH];
>- BOOLEAN CreateDateExist;
>- BOOLEAN UsageDateExist;
>- BOOLEAN AccessPolicyModified;
>- BOOLEAN IdentityPolicyModified;
>- BOOLEAN NewIdentityPolicyModified;
>-} USER_INFO;
>-
>-//
>-// User access information structure.
>-//
>-typedef struct {
>- UINTN LoadPermitLen;
>- UINTN LoadForbidLen;
>- UINTN ConnectPermitLen;
>- UINTN ConnectForbidLen;
>- UINT8 *LoadPermit;
>- UINT8 *LoadForbid;
>- UINT8 *ConnectPermit;
>- UINT8 *ConnectForbid;
>- UINT32 AccessBootOrder;
>- UINT8 AccessRight;
>- UINT8 AccessSetup;
>-} USER_INFO_ACCESS;
>-
>-#define USER_PROFILE_MANAGER_SIGNATURE SIGNATURE_32 ('U', 'P', 'M',
>'S')
>-
>-typedef struct {
>- UINTN Signature;
>- EFI_HANDLE DriverHandle;
>- EFI_HII_HANDLE HiiHandle;
>- EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
>-} USER_PROFILE_MANAGER_CALLBACK_INFO;
>-
>-//
>-// HII specific Vendor Device Path definition.
>-//
>-typedef struct {
>- VENDOR_DEVICE_PATH VendorDevicePath;
>- EFI_DEVICE_PATH_PROTOCOL End;
>-} HII_VENDOR_DEVICE_PATH;
>-
>-//
>-// This is the generated IFR binary data for each formset defined in VFR.
>-//
>-extern UINT8 UserProfileManagerVfrBin[];
>-
>-//
>-// This is the generated String package data for .UNI file.
>-//
>-extern UINT8 UserProfileManagerStrings[];
>-
>-//
>-// The user manager protocol, used in several function.
>-//
>-extern EFI_USER_MANAGER_PROTOCOL *mUserManager;
>-
>-//
>-// The credential providers database in system.
>-//
>-extern CREDENTIAL_PROVIDER_INFO *mProviderInfo;
>-
>-//
>-// The variables used to update identity policy.
>-//
>-extern UINT8 mProviderChoice;
>-extern UINT8 mConncetLogical;
>-
>-//
>-// The variables used to update access policy.
>-//
>-extern USER_INFO_ACCESS mAccessInfo;
>-
>-//
>-// The user information used to record all data in UI.
>-//
>-extern USER_INFO mUserInfo;
>-
>-extern USER_PROFILE_MANAGER_CALLBACK_INFO *mCallbackInfo;
>-
>-extern EFI_USER_PROFILE_HANDLE mModifyUser;
>-
>-/**
>- Get string by string id from HII Interface.
>-
>-
>- @param[in] Id String ID to get the string from.
>-
>- @retval CHAR16 * String from ID.
>- @retval NULL If error occurs.
>-
>-**/
>-CHAR16 *
>-GetStringById (
>- IN EFI_STRING_ID Id
>- );
>-
>-/**
>- Add a new user profile into the user profile database.
>-
>-**/
>-VOID
>-CallAddUser (
>- VOID
>- );
>-
>-/**
>- Display user select form; can select a user to modify.
>-
>-**/
>-VOID
>-SelectUserToModify (
>- VOID
>- );
>-
>-/**
>- Display user select form, cab select a user to delete.
>-
>-**/
>-VOID
>-SelectUserToDelete (
>- VOID
>- );
>-
>-/**
>- Delete the user specified by UserIndex in user profile database.
>-
>- @param[in] UserIndex The index of user in the user name list to be
>deleted.
>-
>-**/
>-VOID
>-DeleteUser (
>- IN UINT8 UserIndex
>- );
>-
>-/**
>- Add a username item in form.
>-
>- @param[in] User Points to the user profile whose username is added.
>- @param[in] Index The index of the user in the user name list.
>- @param[in] OpCodeHandle Points to container for dynamic created
>opcodes.
>-
>-**/
>-VOID
>-AddUserToForm (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT16 Index,
>- IN VOID *OpCodeHandle
>- );
>-
>-/**
>- Display modify user information form
>-
>- In this form, username, create Date, usage date, usage count, identity policy,
>- and access policy are displayed.
>-
>- @param[in] UserIndex The index of the user in display list to modify.
>-
>-**/
>-VOID
>-ModifyUserInfo (
>- IN UINT8 UserIndex
>- );
>-
>-/**
>- Get the username from user input and update username string in Hii
>- database with it.
>-
>-**/
>-VOID
>-ModifyUserName (
>- VOID
>- );
>-
>-/**
>- Display the form of modifying user identity policy.
>-
>-**/
>-VOID
>-ModifyIdentityPolicy (
>- VOID
>- );
>-
>-/**
>- Update the mUserInfo.NewIdentityPolicy and UI when 'add option' is
>pressed.
>-
>-**/
>-VOID
>-AddIdentityPolicyItem (
>- VOID
>- );
>-
>-/**
>- Save the identity policy and update UI with it.
>-
>- This function will verify the new identity policy, in current implementation,
>- the identity policy can be: T, P & P & P & ..., P | P | P | ...
>- Here, "T" means "True", "P" means "Credential Provider", "&" means "and",
>"|" means "or".
>- Other identity policies are not supported.
>-
>-**/
>-VOID
>-SaveIdentityPolicy (
>- VOID
>- );
>-
>-/**
>- Display modify user access policy form
>-
>- In this form, access right, access setu,p and access boot order are
>dynamically
>- added. Load devicepath and connect devicepath are displayed too.
>-
>-**/
>-VOID
>-ModidyAccessPolicy (
>- VOID
>- );
>-
>-/**
>- Collect all the access policy data to mUserInfo.AccessPolicy,
>- and save it to user profile.
>-
>-**/
>-VOID
>-SaveAccessPolicy (
>- VOID
>- );
>-
>-/**
>- Get current user's access rights.
>-
>- @param[out] AccessRight Points to the buffer used for user's access rights.
>-
>- @retval EFI_SUCCESS Get current user access rights successfully.
>- @retval others Fail to get current user access rights.
>-
>-**/
>-EFI_STATUS
>-GetAccessRight (
>- OUT UINT32 *AccessRight
>- );
>-
>-/**
>- Display the permit load device path in the loadable device path list.
>-
>-**/
>-VOID
>-DisplayLoadPermit(
>- VOID
>- );
>-
>-/**
>- Display the forbid load device path list (mAccessInfo.LoadForbid).
>-
>-**/
>-VOID
>-DisplayLoadForbid (
>- VOID
>- );
>-
>-/**
>- Display the permit connect device path.
>-
>-**/
>-VOID
>-DisplayConnectPermit (
>- VOID
>- );
>-
>-/**
>- Display the forbid connect device path list.
>-
>-**/
>-VOID
>-DisplayConnectForbid (
>- VOID
>- );
>-
>-/**
>- Delete the specified device path by DriverIndex from the forbid device path
>- list (mAccessInfo.LoadForbid).
>-
>- @param[in] DriverIndex The index of driver in a forbidden device path list.
>-
>-**/
>-VOID
>-DeleteFromForbidLoad (
>- IN UINT16 DriverIndex
>- );
>-
>-/**
>- Add the specified device path by DriverIndex to the forbid device path
>- list (mAccessInfo.LoadForbid).
>-
>- @param[in] DriverIndex The index of driver saved in driver options.
>-
>-**/
>-VOID
>-AddToForbidLoad (
>- IN UINT16 DriverIndex
>- );
>-
>-/**
>- Get user name from the popup windows.
>-
>- @param[in, out] UserNameLen On entry, point to the buffer lengh of
>UserName.
>- On exit, point to the input user name length.
>- @param[out] UserName The buffer to hold the input user name.
>-
>- @retval EFI_ABORTED It is given up by pressing 'ESC' key.
>- @retval EFI_NOT_READY Not a valid input at all.
>- @retval EFI_SUCCESS Get a user name successfully.
>-
>-**/
>-EFI_STATUS
>-GetUserNameInput (
>- IN OUT UINTN *UserNameLen,
>- OUT CHAR16 *UserName
>- );
>-
>-/**
>- Find the specified info in User profile by the InfoType.
>-
>- @param[in] User Handle of the user whose information will be
>searched.
>- @param[in] InfoType The user information type to find.
>- @param[out] UserInfo Points to user information handle found.
>-
>- @retval EFI_SUCCESS Find the user information successfully.
>- @retval Others Fail to find the user information.
>-
>-**/
>-EFI_STATUS
>-FindInfoByType (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT8 InfoType,
>- OUT EFI_USER_INFO_HANDLE *UserInfo
>- );
>-
>-/**
>- Convert the identity policy to a unicode string and update the Hii database
>- IpStringId string with it.
>-
>- @param[in] Ip Points to identity policy.
>- @param[in] IpLen The identity policy length.
>- @param[in] IpStringId String ID in the HII database to be replaced.
>-
>-**/
>-VOID
>-ResolveIdentityPolicy (
>- IN UINT8 *Ip,
>- IN UINTN IpLen,
>- IN EFI_STRING_ID IpStringId
>- );
>-
>-/**
>- Expand access policy memory size.
>-
>- @param[in] ValidLen The valid access policy length.
>- @param[in] ExpandLen The length that is needed to expand.
>-
>-**/
>-VOID
>-ExpandMemory (
>- IN UINTN ValidLen,
>- IN UINTN ExpandLen
>- );
>-
>-/**
>- Delete User's credental from all the providers that exist in User's identity
>policy.
>-
>- @param[in] IdentityPolicy Point to User's identity policy.
>- @param[in] IdentityPolicyLen The length of the identity policy.
>- @param[in] User Points to user profile.
>-
>-**/
>-VOID
>-DeleteCredentialFromProviders (
>- IN UINT8 *IdentityPolicy,
>- IN UINTN IdentityPolicyLen,
>- IN EFI_USER_PROFILE_HANDLE User
>- );
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.uni
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.uni
>deleted file mode 100644
>index e4a768e00a..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>er.uni
>+++ /dev/null
>@@ -1,22 +0,0 @@
>-// /** @file
>-// A UI tool to manage user profiles
>-//
>-// By this module, user can add/update/delete user profiles, and can also
>-// modify the user access policy and the user identification policy.
>-//
>-// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-
>-#string STR_MODULE_ABSTRACT #language en-US "A UI tool to
>manage user profiles"
>-
>-#string STR_MODULE_DESCRIPTION #language en-US "By this module,
>user can add/update/delete user profiles, and can also modify the user access
>policy and the user identification policy."
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erData.h
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erData.h
>deleted file mode 100644
>index a83caac9ba..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erData.h
>+++ /dev/null
>@@ -1,158 +0,0 @@
>-/** @file
>- The form data for user profile manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#ifndef __USER_PROFILE_MANAGER_DATA_H__
>-#define __USER_PROFILE_MANAGER_DATA_H__
>-
>-#include <Guid/UserProfileManagerHii.h>
>-
>-//
>-// Form ID
>-//
>-#define FORMID_USER_MANAGE 0x0001
>-#define FORMID_MODIFY_USER 0x0002
>-#define FORMID_DEL_USER 0x0003
>-#define FORMID_USER_INFO 0x0004
>-#define FORMID_MODIFY_IP 0x0005
>-#define FORMID_MODIFY_AP 0x0006
>-#define FORMID_LOAD_DP 0x0007
>-#define FORMID_CONNECT_DP 0x0008
>-#define FORMID_PERMIT_LOAD_DP 0x0009
>-#define FORMID_FORBID_LOAD_DP 0x000A
>-#define FORMID_PERMIT_CONNECT_DP 0x000B
>-#define FORMID_FORBID_CONNECT_DP 0x000C
>-
>-//
>-// Label ID
>-//
>-#define LABEL_USER_MANAGE_FUNC 0x0010
>-#define LABEL_USER_DEL_FUNC 0x0020
>-#define LABEL_USER_MOD_FUNC 0x0030
>-#define LABEL_USER_INFO_FUNC 0x0040
>-#define LABEL_IP_MOD_FUNC 0x0050
>-#define LABEL_AP_MOD_FUNC 0x0060
>-#define LABEL_PERMIT_LOAD_FUNC 0x0070
>-#define LABLE_FORBID_LOAD_FUNC 0x0080
>-#define LABEL_END 0x00F0
>-
>-//
>-// First form key (Add/modify/del user profile).
>-// First 2 bits (bit 16~15).
>-//
>-#define KEY_MODIFY_USER 0x4000
>-#define KEY_DEL_USER 0x8000
>-#define KEY_ADD_USER 0xC000
>-#define KEY_FIRST_FORM_MASK 0xC000
>-
>-//
>-// Second form key (Display new form /Select user / modify device path in
>access policy).
>-// Next 2 bits (bit 14~13).
>-//
>-#define KEY_ENTER_NEXT_FORM 0x0000
>-#define KEY_SELECT_USER 0x1000
>-#define KEY_MODIFY_AP_DP 0x2000
>-#define KEY_OPEN_CLOSE_FORM_ACTION 0x3000
>-#define KEY_SECOND_FORM_MASK 0x3000
>-
>-//
>-// User profile information form key.
>-// Next 3 bits (bit 12~10).
>-//
>-#define KEY_MODIFY_NAME 0x0200
>-#define KEY_MODIFY_IP 0x0400
>-#define KEY_MODIFY_AP 0x0600
>-#define KEY_MODIFY_INFO_MASK 0x0E00
>-
>-//
>-// Specified key, used in VFR (KEY_MODIFY_USER | KEY_SELECT_USER |
>KEY_MODIFY_NAME).
>-//
>-#define KEY_MODIFY_USER_NAME 0x5200
>-
>-//
>-// Modify identity policy form key.
>-// Next 3 bits (bit 9~7).
>-//
>-#define KEY_MODIFY_PROV 0x0040
>-#define KEY_MODIFY_MTYPE 0x0080
>-#define KEY_MODIFY_CONN 0x00C0
>-#define KEY_ADD_IP_OP 0x0100
>-#define KEY_IP_RETURN_UIF 0x0140
>-#define KEY_MODIFY_IP_MASK 0x01C0
>-
>-//
>-// Specified key.
>-//
>-#define KEY_ADD_LOGICAL_OP 0x5500
>-#define KEY_IP_RETURN 0x5540
>-
>-//
>-// Modify access policy form key.
>-// Next 3 bits (bit 9~7).
>-//
>-#define KEY_MODIFY_RIGHT 0x0040
>-#define KEY_MODIFY_SETUP 0x0080
>-#define KEY_MODIFY_BOOT 0x00C0
>-#define KEY_MODIFY_LOAD 0x0100
>-#define KEY_MODIFY_CONNECT 0x0140
>-#define KEY_AP_RETURN_UIF 0x0180
>-#define KEY_MODIFY_AP_MASK 0x01C0
>-
>-//
>-// Specified key.
>-//
>-#define KEY_LOAD_DP 0x5700
>-#define KEY_CONN_DP 0x5740
>-#define KEY_AP_RETURN 0x5780
>-
>-//
>-// Device path form key.
>-// Next 2 bits (bit 6~5).
>-//
>-#define KEY_PERMIT_MODIFY 0x0010
>-#define KEY_FORBID_MODIFY 0x0020
>-#define KEY_DISPLAY_DP_MASK 0x0030
>-
>-//
>-// Specified key.
>-//
>-#define KEY_LOAD_PERMIT 0x5710
>-#define KEY_LOAD_FORBID 0x5720
>-#define KEY_CONNECT_PERMIT 0x5750
>-#define KEY_CONNECT_FORBID 0x5760
>-
>-//
>-// Device path modify key.
>-// 2 bits (bit 12~11).
>-//
>-#define KEY_LOAD_PERMIT_MODIFY 0x0000
>-#define KEY_LOAD_FORBID_MODIFY 0x0400
>-#define KEY_CONNECT_PERMIT_MODIFY 0x0800
>-#define KEY_CONNECT_FORBID_MODIFY 0x0C00
>-#define KEY_MODIFY_DP_MASK 0x0C00
>-
>-
>-//
>-// The permissions usable when configuring the platform.
>-//
>-#define ACCESS_SETUP_RESTRICTED 1
>-#define ACCESS_SETUP_NORMAL 2
>-#define ACCESS_SETUP_ADMIN 3
>-
>-//
>-// Question ID for the question used in each form
>(KEY_OPEN_CLOSE_FORM_ACTION | FORMID_FORM_USER_MANAGE)
>-// This ID is used in FORM OPEN/CLOSE CallBack action.
>-//
>-#define QUESTIONID_USER_MANAGE 0x3001
>-
>-#endif
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erDxe.inf
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erDxe.inf
>deleted file mode 100644
>index cdd97731b2..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erDxe.inf
>+++ /dev/null
>@@ -1,72 +0,0 @@
>-## @file
>-# A UI tool to manage user profiles
>-#
>-# By this module, user can add/update/delete user profiles, and can also
>-# modify the user access policy and the user identification policy.
>-#
>-# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-# This program and the accompanying materials
>-# are licensed and made available under the terms and conditions of the BSD
>License
>-# which accompanies this distribution. The full text of the license may be
>found at
>-# http://opensource.org/licenses/bsd-license.php
>-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-#
>-##
>-
>-[Defines]
>- INF_VERSION = 0x00010005
>- BASE_NAME = UserProfileManager
>- MODULE_UNI_FILE = UserProfileManager.uni
>- FILE_GUID = E38CB52D-A74D-45db-A8D0-290C9B21BBF2
>- MODULE_TYPE = DXE_DRIVER
>- VERSION_STRING = 1.0
>- ENTRY_POINT = UserProfileManagerInit
>-
>-[Sources]
>- UserProfileManager.c
>- UserProfileManager.h
>- UserProfileAdd.c
>- UserProfileDelete.c
>- UserProfileModify.c
>- ModifyIdentityPolicy.c
>- ModifyAccessPolicy.c
>- UserProfileManagerData.h
>- UserProfileManagerStrings.uni
>- UserProfileManagerVfr.Vfr
>-
>-[Packages]
>- MdePkg/MdePkg.dec
>- MdeModulePkg/MdeModulePkg.dec
>- SecurityPkg/SecurityPkg.dec
>-
>-[LibraryClasses]
>- UefiRuntimeServicesTableLib
>- UefiBootServicesTableLib
>- UefiDriverEntryPoint
>- MemoryAllocationLib
>- BaseMemoryLib
>- DebugLib
>- HiiLib
>- UefiLib
>- DevicePathLib
>-
>-[Guids]
>- gEfiIfrTianoGuid ## SOMETIMES_CONSUMES ## GUID
>- gEfiUserInfoAccessSetupAdminGuid ## SOMETIMES_CONSUMES ##
>GUID
>- gEfiUserInfoAccessSetupNormalGuid ## SOMETIMES_CONSUMES ##
>GUID
>- gEfiUserInfoAccessSetupRestrictedGuid ## SOMETIMES_CONSUMES
>## GUID
>- gUserProfileManagerGuid ## CONSUMES ## HII
>-
>-[Protocols]
>- gEfiDevicePathProtocolGuid ## PRODUCES
>- gEfiHiiConfigAccessProtocolGuid ## PRODUCES
>- gEfiUserCredential2ProtocolGuid ## SOMETIMES_CONSUMES
>- gEfiUserManagerProtocolGuid ## CONSUMES
>-
>-[Depex]
>- gEfiUserManagerProtocolGuid
>-
>-[UserExtensions.TianoCore."ExtraFiles"]
>- UserProfileManagerExtra.uni
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erExtra.uni
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erExtra.uni
>deleted file mode 100644
>index bf7ac7dc04..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erExtra.uni
>+++ /dev/null
>@@ -1,19 +0,0 @@
>-// /** @file
>-// UserProfileManager Localized Strings and Content
>-//
>-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
>-//
>-// This program and the accompanying materials
>-// are licensed and made available under the terms and conditions of the BSD
>License
>-// which accompanies this distribution. The full text of the license may be
>found at
>-// http://opensource.org/licenses/bsd-license.php
>-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>BASIS,
>-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-//
>-// **/
>-
>-#string STR_PROPERTIES_MODULE_NAME
>-#language en-US
>-"User Profile Manager"
>-
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erStrings.uni
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erStrings.uni
>deleted file mode 100644
>index 3a003a9883..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erStrings.uni
>+++ /dev/null
>@@ -1,158 +0,0 @@
>-/** @file
>- String definitions for User Profile Manager driver.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#langdef en-US "English"
>-#langdef fr-FR "Français"
>-
>-#string STR_NULL_STRING #language en-US ""
>- #language fr-FR ""
>-#string STR_FORMSET_TITLE #language en-US "User Manager"
>- #language fr-FR "User Manager(French)"
>-#string STR_TITLE_HELP #language en-US "This selection will take
>you to the User Manager"
>- #language fr-FR "This selection will take you to the User
>Manager(French)"
>-#string STR_USERMAN_TITLE #language en-US "User Manager"
>- #language fr-FR "User Manager(French)"
>-#string STR_ADD_USER_TITLE #language en-US "Add User Profile"
>- #language fr-FR "Add User Profile(French)"
>-#string STR_ADD_USER_HELP #language en-US "Add User Profile to
>User Database"
>- #language fr-FR "Add User Profile to User
>Database(French)"
>-#string STR_MODIFY_USER_TITLE #language en-US "Modify User
>Profile"
>- #language fr-FR "Modify User Profile(French)"
>-#string STR_MODIFY_USER_HELP #language en-US "Modify User Profile
>Information"
>- #language fr-FR "Modify User Profile
>Information(French)"
>-#string STR_DELETE_USER_TITLE #language en-US "Delete User Profile"
>- #language fr-FR "Delete User Profile(French)"
>-#string STR_DELETE_USER_HELP #language en-US "Delete User Profile
>from User Database"
>- #language fr-FR "Delete User Profile from User
>Database(French)"
>-#string STR_USER_INFO #language en-US "User Profile
>Information"
>- #language fr-FR "User Profile Information(French)"
>-#string STR_USER_NAME #language en-US "User Name"
>- #language fr-FR "User Name(French)"
>-#string STR_USER_NAME_VAL #language en-US ""
>- #language fr-FR ""
>-#string STR_CREATE_DATE #language en-US "Create Date"
>- #language fr-FR "Create Date(French)"
>-#string STR_CREATE_DATE_VAL #language en-US ""
>- #language fr-FR ""
>-#string STR_USAGE_DATE #language en-US "Usage Date"
>- #language fr-FR "Usage Date(French)"
>-#string STR_USAGE_DATE_VAL #language en-US ""
>- #language fr-FR ""
>-#string STR_USAGE_COUNT #language en-US "Usage Count"
>- #language fr-FR "Usage Count(French)"
>-#string STR_USAGE_COUNT_VAL #language en-US ""
>- #language fr-FR ""
>-#string STR_IDENTIFY_POLICY #language en-US "Identify Policy"
>- #language fr-FR "Identify Policy(French)"
>-#string STR_IDENTIFY_POLICY_VAL #language en-US ""
>- #language fr-FR ""
>-#string STR_ACCESS_POLICY #language en-US "Access Policy"
>- #language fr-FR "Access Policy(French)"
>-#string STR_SAVE #language en-US "Save & Exit"
>- #language fr-FR "Save & Exit(French)"
>-#string STR_IDENTIFY_SAVE_HELP #language en-US "Save Identify Policy
>and Exit"
>- #language fr-FR "Save Identify Policy and Exit(French)"
>-#string STR_PROVIDER #language en-US "Credential Provider"
>- #language fr-FR "Credential Provider(French)"
>-#string STR_PROVIDER_HELP #language en-US "Select Credential
>Provider Option"
>- #language fr-FR "Select Credential Provider
>Option(French)"
>-#string STR_OR_CON #language en-US "Or"
>- #language fr-FR "Or(French)"
>-#string STR_AND_CON #language en-US "And"
>- #language fr-FR "And(French)"
>-#string STR_CONNECTOR #language en-US "Logical Connector"
>- #language fr-FR "Logical Connector(French)"
>-#string STR_CONNECTOR_HELP #language en-US "Select Logical
>Connector Option"
>- #language fr-FR "Select Logical Connector
>Option(French)"
>-#string STR_IDENTIFY_POLICY_VALUE #language en-US ""
>- #language fr-FR ""
>-#string STR_IDENTIFY_POLICY_HELP #language en-US "Current Identify
>Policy"
>- #language fr-FR "Current Identify Policy(French)"
>-#string STR_ADD_OPTION #language en-US "Add Option"
>- #language fr-FR "Add Option(French)"
>-#string STR_ADD_OPTION_HELP #language en-US "Add This Option to
>Identify Policy"
>- #language fr-FR "Add This Option to Identify
>Policy(French)"
>-#string STR_ACCESS_SAVE_HELP #language en-US "Save Access Policy
>and Exit"
>- #language fr-FR "Save Access Policy and Exit(French)"
>-#string STR_ACCESS_RIGHT #language en-US "Access Right"
>- #language fr-FR "Access Right(French)"
>-#string STR_ACCESS_RIGHT_HELP #language en-US "Select Access Right
>Option"
>- #language fr-FR "Select Access Right Option(French)"
>-#string STR_NORMAL #language en-US "Normal"
>- #language fr-FR "Normal(French)"
>-#string STR_ENROLL #language en-US "Enroll"
>- #language fr-FR "Enroll(French)"
>-#string STR_MANAGE #language en-US "Manage"
>- #language fr-FR "Manage(French)"
>-#string STR_ACCESS_SETUP #language en-US "Access Setup"
>- #language fr-FR "Access Setup(French)"
>-#string STR_ACCESS_SETUP_HELP #language en-US "Select Access
>Setup Option"
>- #language fr-FR "Selelct Access Setup Option(French)"
>-#string STR_RESTRICTED #language en-US "Restricted"
>- #language fr-FR "Restricted(French)"
>-#string STR_ADMIN #language en-US "Admin"
>- #language fr-FR "Admin(French)"
>-#string STR_BOOR_ORDER #language en-US "Access Boot Order"
>- #language fr-FR "Access Boot Order(French)"
>-#string STR_BOOT_ORDER_HELP #language en-US "Select Access Boot
>Order Option"
>- #language fr-FR "Select Access Boot Order
>Option(French)"
>-#string STR_INSERT #language en-US "Insert"
>- #language fr-FR "Insert(French)"
>-#string STR_APPEND #language en-US "Append"
>- #language fr-FR "Append(French)"
>-#string STR_REPLACE #language en-US "Replace"
>- #language fr-FR "Replace(French)"
>-#string STR_NODEFAULT #language en-US "Nodefault"
>- #language fr-FR "Nodefault(French)"
>-#string STR_LOAD #language en-US "Load Device Path"
>- #language fr-FR "Load Device Path(French)"
>-#string STR_LOAD_HELP #language en-US "Select Permit/Forbid
>Load Device Path"
>- #language fr-FR "Select Permit/Forbid Load Device
>Path(French)"
>-#string STR_CONNECT #language en-US "Connect Device Path"
>- #language fr-FR "Connect Device Path(French)"
>-#string STR_CONNECT_HELP #language en-US "Select Permit/Forbid
>Connect Device Path"
>- #language fr-FR "Select Permit/Forbid Connect Device
>Path(French)"
>-#string STR_LOAD_PERMIT #language en-US "Permit Load Device
>Path"
>- #language fr-FR "Permit Load Device Path(French)"
>-#string STR_LOAD_PERMIT_HELP #language en-US "Change Permit
>Load Device Path to Forbid"
>- #language fr-FR "Change Permit Load Device Path to
>Forbid(French)"
>-#string STR_LOAD_FORBID #language en-US "Forbid Load Device
>Path"
>- #language fr-FR "Forbid Load Device Path(French)"
>-#string STR_LOAD_FORBID_HELP #language en-US "Change Forbid Load
>Device Path to Permit"
>- #language fr-FR "Change Forbid Load Device Path to
>Permit(French)"
>-#string STR_CONNECT_PERMIT #language en-US "Permit Connect
>Device Path"
>- #language fr-FR "Permit Connect Device Path(French)"
>-#string STR_CONNECT_PERMIT_HELP #language en-US "Change Permit
>Connect Device Path to Forbid"
>- #language fr-FR "Change Permit Connect Device Path to
>Forbid(French)"
>-#string STR_CONNECT_FORBID #language en-US "Forbid Connect
>Device Path"
>- #language fr-FR "Forbid Connect Device Path(French)"
>-#string STR_CONNECT_FORBID_HELP #language en-US "Change Forbid
>Connect Device Path to Permit"
>- #language fr-FR "Change Forbid Connect Device Path to
>Permit(French)"
>-#string STR_PRESS_KEY_CONTINUE #language en-US "Press ENTER to
>Continue, Other Key to Cancel ..."
>- #language fr-FR "Press ENTER to Continue, Other Key to
>Cancel ...(French)"
>-#string STR_MOVE_TO_FORBID_LIST #language en-US "Are You Sure to
>Move It to Forbid List?"
>- #language fr-FR "Are You Sure to Move It to Forbid
>List?(French)"
>-#string STR_MOVE_TO_PERMIT_LIST #language en-US "Are You Sure to
>Move It to Permit List?"
>- #language fr-FR "Are You Sure to Move It to Permit
>List?(French)"
>-#string STR_STROKE_KEY_CONTINUE #language en-US "Please Press Any
>Key to Continue ..."
>- #language fr-FR "Please Press Any Key to Continue ...
>(French)"
>-#string STR_CREATE_PROFILE_FAILED #language en-US "Create New User
>Profile Failed!"
>- #language fr-FR "Create New User Profile Failed!
>(French)"
>-#string STR_CREATE_PROFILE_SUCCESS #language en-US "Create New
>User Profile Succeed!"
>- #language fr-FR "Create New User Profile Succeed!
>(French)"
>-#string STR_USER_ALREADY_EXISTED #language en-US "User Name Had
>Already Existed."
>- #language fr-FR "User Name Had Already Existed.
>(French)"
>-#string STR_GET_USERNAME_FAILED #language en-US "Failed To Get
>User Name."
>- #language fr-FR "Failed To Get User Name. (French)"
>-
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erVfr.Vfr
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erVfr.Vfr
>deleted file mode 100644
>index 2cf3359f2a..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileManag
>erVfr.Vfr
>+++ /dev/null
>@@ -1,244 +0,0 @@
>-/** @file
>- User Profile Manager formset.
>-
>-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManagerData.h"
>-
>-#define USER_MANAGER_CLASS 0x00
>-#define USER_MANAGER_SUBCLASS 0x04
>-
>-formset
>- guid = USER_PROFILE_MANAGER_GUID,
>- title = STRING_TOKEN(STR_FORMSET_TITLE),
>- help = STRING_TOKEN(STR_TITLE_HELP),
>-
>- // User manager form
>- form formid = FORMID_USER_MANAGE,
>- title = STRING_TOKEN(STR_USERMAN_TITLE);
>-
>- label LABEL_USER_MANAGE_FUNC;
>- label LABEL_END;
>-
>- suppressif TRUE;
>- text
>- help = STRING_TOKEN(STR_NULL_STRING),
>- text = STRING_TOKEN(STR_NULL_STRING),
>- flags = INTERACTIVE,
>- key = QUESTIONID_USER_MANAGE;
>- endif;
>-
>- endform;
>-
>- // Modify user profile form
>- form formid = FORMID_MODIFY_USER,
>- title = STRING_TOKEN(STR_MODIFY_USER_TITLE);
>-
>- label LABEL_USER_MOD_FUNC;
>- label LABEL_END;
>-
>- endform;
>-
>- // Delete user profile form
>- form formid = FORMID_DEL_USER,
>- title = STRING_TOKEN(STR_DELETE_USER_TITLE);
>-
>- label LABEL_USER_DEL_FUNC;
>- label LABEL_END;
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>- endform;
>-
>- //
>- // User profile information form
>- //
>- form formid = FORMID_USER_INFO,
>- title = STRING_TOKEN(STR_USER_INFO);
>-
>- text
>- help = STRING_TOKEN(STR_USER_NAME_VAL),
>- text = STRING_TOKEN(STR_USER_NAME),
>- flags = INTERACTIVE,
>- key = KEY_MODIFY_USER_NAME;
>-
>- text
>- help = STRING_TOKEN(STR_CREATE_DATE_VAL),
>- text = STRING_TOKEN(STR_CREATE_DATE);
>-
>- text
>- help = STRING_TOKEN(STR_USAGE_DATE_VAL),
>- text = STRING_TOKEN(STR_USAGE_DATE);
>-
>- text
>- help = STRING_TOKEN(STR_USAGE_COUNT_VAL),
>- text = STRING_TOKEN(STR_USAGE_COUNT);
>-
>- label LABEL_USER_INFO_FUNC;
>- label LABEL_END;
>-
>- endform;
>-
>- //
>- // Identify policy modify form
>- //
>- form formid = FORMID_MODIFY_IP,
>- title = STRING_TOKEN(STR_IDENTIFY_POLICY);
>-
>- text
>- help = STRING_TOKEN(STR_IDENTIFY_POLICY_HELP),
>- text = STRING_TOKEN(STR_IDENTIFY_POLICY),
>- text = STRING_TOKEN(STR_IDENTIFY_POLICY_VALUE);
>-
>- label LABEL_IP_MOD_FUNC;
>- label LABEL_END;
>-
>- text
>- help = STRING_TOKEN(STR_ADD_OPTION_HELP),
>- text = STRING_TOKEN(STR_ADD_OPTION),
>- flags = INTERACTIVE,
>- key = KEY_ADD_LOGICAL_OP;
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- text
>- help = STRING_TOKEN(STR_IDENTIFY_SAVE_HELP),
>- text = STRING_TOKEN(STR_SAVE),
>- flags = INTERACTIVE,
>- key = KEY_IP_RETURN;
>-
>- endform;
>-
>- //
>- // Access policy modify form
>- //
>- form formid = FORMID_MODIFY_AP,
>- title = STRING_TOKEN(STR_ACCESS_POLICY);
>-
>- label LABEL_AP_MOD_FUNC;
>- label LABEL_END;
>-
>- goto FORMID_LOAD_DP,
>- prompt = STRING_TOKEN(STR_LOAD),
>- help = STRING_TOKEN(STR_LOAD_HELP),
>- flags = INTERACTIVE,
>- key = KEY_LOAD_DP;
>-
>- goto FORMID_CONNECT_DP,
>- prompt = STRING_TOKEN(STR_CONNECT),
>- help = STRING_TOKEN(STR_CONNECT_HELP),
>- flags = INTERACTIVE,
>- key = KEY_CONN_DP;
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- text
>- help = STRING_TOKEN(STR_ACCESS_SAVE_HELP),
>- text = STRING_TOKEN(STR_SAVE),
>- flags = INTERACTIVE,
>- key = KEY_AP_RETURN;
>-
>- endform;
>-
>- //
>- // Load device path form
>- //
>- form formid = FORMID_LOAD_DP,
>- title = STRING_TOKEN(STR_LOAD);
>-
>- goto FORMID_PERMIT_LOAD_DP,
>- prompt = STRING_TOKEN(STR_LOAD_PERMIT),
>- help = STRING_TOKEN(STR_LOAD_PERMIT_HELP),
>- flags = INTERACTIVE,
>- key = KEY_LOAD_PERMIT;
>-
>- goto FORMID_FORBID_LOAD_DP,
>- prompt = STRING_TOKEN(STR_LOAD_FORBID),
>- help = STRING_TOKEN(STR_LOAD_FORBID_HELP),
>- flags = INTERACTIVE,
>- key = KEY_LOAD_FORBID;
>-
>- endform;
>-
>- //
>- // Permit load device path form
>- //
>- form formid = FORMID_PERMIT_LOAD_DP,
>- title = STRING_TOKEN(STR_LOAD_PERMIT);
>-
>- label LABEL_PERMIT_LOAD_FUNC;
>- label LABEL_END;
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- endform;
>-
>- //
>- // Forbid load device path form
>- //
>- form formid = FORMID_FORBID_LOAD_DP,
>- title = STRING_TOKEN(STR_LOAD_FORBID);
>-
>- label LABLE_FORBID_LOAD_FUNC;
>- label LABEL_END;
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- endform;
>-
>- //
>- // Connect device path form
>- //
>- form formid = FORMID_CONNECT_DP,
>- title = STRING_TOKEN(STR_CONNECT);
>-
>- goto FORMID_PERMIT_CONNECT_DP,
>- prompt = STRING_TOKEN(STR_CONNECT_PERMIT),
>- help = STRING_TOKEN(STR_CONNECT_PERMIT_HELP),
>- flags = INTERACTIVE,
>- key = KEY_CONNECT_PERMIT;
>-
>- goto FORMID_FORBID_CONNECT_DP,
>- prompt = STRING_TOKEN(STR_CONNECT_FORBID),
>- help = STRING_TOKEN(STR_CONNECT_FORBID_HELP),
>- flags = INTERACTIVE,
>- key = KEY_CONNECT_FORBID;
>-
>- endform;
>-
>- //
>- // Permit connect device path form
>- //
>- form formid = FORMID_PERMIT_CONNECT_DP,
>- title = STRING_TOKEN(STR_CONNECT_PERMIT);
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- endform;
>-
>- //
>- // Forbid connect device path form
>- //
>- form formid = FORMID_FORBID_CONNECT_DP,
>- title = STRING_TOKEN(STR_CONNECT_FORBID);
>-
>- subtitle
>- text = STRING_TOKEN(STR_NULL_STRING);
>-
>- endform;
>-
>-endformset;
>diff --git
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileModify
>.c
>b/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileModify
>.c
>deleted file mode 100644
>index d165e5ae9b..0000000000
>---
>a/SecurityPkg/UserIdentification/UserProfileManagerDxe/UserProfileModify
>.c
>+++ /dev/null
>@@ -1,1475 +0,0 @@
>-/** @file
>- The functions to modify a user profile.
>-
>-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
>-This program and the accompanying materials
>-are licensed and made available under the terms and conditions of the BSD
>License
>-which accompanies this distribution. The full text of the license may be
>found at
>-http://opensource.org/licenses/bsd-license.php
>-
>-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>EXPRESS OR IMPLIED.
>-
>-**/
>-
>-#include "UserProfileManager.h"
>-
>-EFI_USER_PROFILE_HANDLE mModifyUser = NULL;
>-
>-/**
>- Display user select form, cab select a user to modify.
>-
>-**/
>-VOID
>-SelectUserToModify (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- UINT8 Index;
>- EFI_USER_PROFILE_HANDLE User;
>- EFI_USER_PROFILE_HANDLE CurrentUser;
>- UINT32 CurrentAccessRight;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_USER_MOD_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add each user can be modified.
>- //
>- User = NULL;
>- Index = 1;
>- mUserManager->Current (mUserManager, &CurrentUser);
>- while (TRUE) {
>- Status = mUserManager->GetNext (mUserManager, &User);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- Status = GetAccessRight (&CurrentAccessRight);
>- if (EFI_ERROR (Status)) {
>- CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- }
>-
>- if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) || (User ==
>CurrentUser)) {
>- AddUserToForm (User, (UINT16)(KEY_MODIFY_USER | KEY_SELECT_USER
>| Index), StartOpCodeHandle);
>- }
>- Index++;
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_MODIFY_USER, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>-
>-
>-/**
>- Get all the user info from mModifyUser in the user manager, and save on
>the
>- global variable.
>-
>-**/
>-VOID
>-GetAllUserInfo (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>- UINTN InfoSize;
>- UINTN MemSize;
>- UINTN DataLen;
>-
>- //
>- // Init variable to default value.
>- //
>- mProviderChoice = 0;
>- mConncetLogical = 0;
>-
>- mUserInfo.CreateDateExist = FALSE;
>- mUserInfo.UsageDateExist = FALSE;
>- mUserInfo.UsageCount = 0;
>-
>- mUserInfo.AccessPolicyLen = 0;
>- mUserInfo.AccessPolicyModified = FALSE;
>- if (mUserInfo.AccessPolicy != NULL) {
>- FreePool (mUserInfo.AccessPolicy);
>- mUserInfo.AccessPolicy = NULL;
>- }
>- mUserInfo.IdentityPolicyLen = 0;
>- mUserInfo.IdentityPolicyModified = FALSE;
>- if (mUserInfo.IdentityPolicy != NULL) {
>- FreePool (mUserInfo.IdentityPolicy);
>- mUserInfo.IdentityPolicy = NULL;
>- }
>-
>- //
>- // Allocate user information memory.
>- //
>- MemSize = sizeof (EFI_USER_INFO) + 63;
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return ;
>- }
>-
>- //
>- // Get each user information.
>- //
>- UserInfo = NULL;
>- while (TRUE) {
>- Status = mUserManager->GetNextInfo (mUserManager, mModifyUser,
>&UserInfo);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- //
>- // Get information.
>- //
>- InfoSize = MemSize;
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- mModifyUser,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- MemSize = InfoSize;
>- FreePool (Info);
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return ;
>- }
>-
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- mModifyUser,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- }
>-
>- if (Status == EFI_SUCCESS) {
>- //
>- // Deal with each information according to informaiton type.
>- //
>- DataLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- switch (Info->InfoType) {
>- case EFI_USER_INFO_NAME_RECORD:
>- CopyMem (&mUserInfo.UserName, (UINT8 *) (Info + 1), DataLen);
>- break;
>-
>- case EFI_USER_INFO_CREATE_DATE_RECORD:
>- CopyMem (&mUserInfo.CreateDate, (UINT8 *) (Info + 1), DataLen);
>- mUserInfo.CreateDateExist = TRUE;
>- break;
>-
>- case EFI_USER_INFO_USAGE_DATE_RECORD:
>- CopyMem (&mUserInfo.UsageDate, (UINT8 *) (Info + 1), DataLen);
>- mUserInfo.UsageDateExist = TRUE;
>- break;
>-
>- case EFI_USER_INFO_USAGE_COUNT_RECORD:
>- CopyMem (&mUserInfo.UsageCount, (UINT8 *) (Info + 1), DataLen);
>- break;
>-
>- case EFI_USER_INFO_ACCESS_POLICY_RECORD:
>- mUserInfo.AccessPolicy = AllocateZeroPool (DataLen);
>- if (mUserInfo.AccessPolicy == NULL) {
>- break;
>- }
>-
>- CopyMem (mUserInfo.AccessPolicy, (UINT8 *) (Info + 1), DataLen);
>- mUserInfo.AccessPolicyLen = DataLen;
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_POLICY_RECORD:
>- mUserInfo.IdentityPolicy = AllocateZeroPool (DataLen);
>- if (mUserInfo.IdentityPolicy == NULL) {
>- break;
>- }
>-
>- CopyMem (mUserInfo.IdentityPolicy, (UINT8 *) (Info + 1), DataLen);
>- mUserInfo.IdentityPolicyLen = DataLen;
>- break;
>-
>- default:
>- break;
>- }
>- }
>- }
>- FreePool (Info);
>-}
>-
>-
>-/**
>- Convert the Date to a string, and update the Hii database DateID string with
>it.
>-
>- @param[in] Date Points to the date to be converted.
>- @param[in] DateId String ID in the HII database to be replaced.
>-
>-**/
>-VOID
>-ResolveDate (
>- IN EFI_TIME *Date,
>- IN EFI_STRING_ID DateId
>- )
>-{
>- CHAR16 *Str;
>- UINTN DateBufLen;
>-
>- //
>- // Convert date to string.
>- //
>- DateBufLen = 64;
>- Str = AllocateZeroPool (DateBufLen);
>- if (Str == NULL) {
>- return ;
>- }
>-
>- UnicodeSPrint (
>- Str,
>- DateBufLen,
>- L"%4d-%2d-%2d ",
>- Date->Year,
>- Date->Month,
>- Date->Day
>- );
>-
>- //
>- // Convert time to string.
>- //
>- DateBufLen -= StrLen (Str);
>- UnicodeSPrint (
>- Str + StrLen (Str),
>- DateBufLen,
>- L"%2d:%2d:%2d",
>- Date->Hour,
>- Date->Minute,
>- Date->Second
>- );
>-
>- HiiSetString (mCallbackInfo->HiiHandle, DateId, Str, NULL);
>- FreePool (Str);
>-}
>-
>-
>-/**
>- Convert the CountVal to a string, and update the Hii database CountId string
>- with it.
>-
>- @param[in] CountVal The hex value to convert.
>- @param[in] CountId String ID in the HII database to be replaced.
>-
>-**/
>-VOID
>-ResolveCount (
>- IN UINT32 CountVal,
>- IN EFI_STRING_ID CountId
>- )
>-{
>- CHAR16 Count[10];
>-
>- UnicodeSPrint (Count, 20, L"%d", CountVal);
>- HiiSetString (mCallbackInfo->HiiHandle, CountId, Count, NULL);
>-}
>-
>-
>-/**
>- Concatenates one Null-terminated Unicode string to another Null-
>terminated
>- Unicode string.
>-
>- @param[in, out] Source1 On entry, point to a Null-terminated Unicode
>string.
>- On exit, point to a new concatenated Unicode string
>- @param[in] Source2 Pointer to a Null-terminated Unicode string.
>-
>-**/
>-VOID
>-AddStr (
>- IN OUT CHAR16 **Source1,
>- IN CONST CHAR16 *Source2
>- )
>-{
>- CHAR16 *TmpStr;
>- UINTN StrLength;
>-
>- ASSERT (Source1 != NULL);
>- ASSERT (Source2 != NULL);
>-
>- if (*Source1 == NULL) {
>- StrLength = StrSize (Source2);
>- } else {
>- StrLength = StrSize (*Source1);
>- StrLength += StrSize (Source2) - 2;
>- }
>-
>- TmpStr = AllocateZeroPool (StrLength);
>- ASSERT (TmpStr != NULL);
>-
>- if (*Source1 == NULL) {
>- StrCpyS (TmpStr, StrLength / sizeof (CHAR16), Source2);
>- } else {
>- StrCpyS (TmpStr, StrLength / sizeof (CHAR16), *Source1);
>- FreePool (*Source1);
>- StrCatS (TmpStr, StrLength / sizeof (CHAR16),Source2);
>- }
>-
>- *Source1 = TmpStr;
>-}
>-
>-
>-/**
>- Convert the identity policy to a unicode string and update the Hii database
>- IpStringId string with it.
>-
>- @param[in] Ip Points to identity policy.
>- @param[in] IpLen The identity policy length.
>- @param[in] IpStringId String ID in the HII database to be replaced.
>-
>-**/
>-VOID
>-ResolveIdentityPolicy (
>- IN UINT8 *Ip,
>- IN UINTN IpLen,
>- IN EFI_STRING_ID IpStringId
>- )
>-{
>- CHAR16 *TmpStr;
>- UINTN ChkLen;
>- EFI_USER_INFO_IDENTITY_POLICY *Identity;
>- UINT16 Index;
>- CHAR16 *ProvStr;
>- EFI_STRING_ID ProvId;
>- EFI_HII_HANDLE HiiHandle;
>- EFI_USER_CREDENTIAL2_PROTOCOL *UserCredential;
>-
>- TmpStr = NULL;
>-
>- //
>- // Resolve each policy.
>- //
>- ChkLen = 0;
>- while (ChkLen < IpLen) {
>- Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (Ip + ChkLen);
>- switch (Identity->Type) {
>- case EFI_USER_INFO_IDENTITY_FALSE:
>- AddStr (&TmpStr, L"False");
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_TRUE:
>- AddStr (&TmpStr, L"None");
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_NOT:
>- AddStr (&TmpStr, L"! ");
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_AND:
>- AddStr (&TmpStr, L" && ");
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_OR:
>- AddStr (&TmpStr, L" || ");
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:
>- for (Index = 0; Index < mProviderInfo->Count; Index++) {
>- UserCredential = mProviderInfo->Provider[Index];
>- if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential->Type)) {
>- UserCredential->Title (
>- UserCredential,
>- &HiiHandle,
>- &ProvId
>- );
>- ProvStr = HiiGetString (HiiHandle, ProvId, NULL);
>- if (ProvStr != NULL) {
>- AddStr (&TmpStr, ProvStr);
>- FreePool (ProvStr);
>- }
>- break;
>- }
>- }
>- break;
>-
>- case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
>- for (Index = 0; Index < mProviderInfo->Count; Index++) {
>- UserCredential = mProviderInfo->Provider[Index];
>- if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential-
>>Identifier)) {
>- UserCredential->Title (
>- UserCredential,
>- &HiiHandle,
>- &ProvId
>- );
>- ProvStr = HiiGetString (HiiHandle, ProvId, NULL);
>- if (ProvStr != NULL) {
>- AddStr (&TmpStr, ProvStr);
>- FreePool (ProvStr);
>- }
>- break;
>- }
>- }
>- break;
>- }
>-
>- ChkLen += Identity->Length;
>- }
>-
>- if (TmpStr != NULL) {
>- HiiSetString (mCallbackInfo->HiiHandle, IpStringId, TmpStr, NULL);
>- FreePool (TmpStr);
>- }
>-}
>-
>-
>-/**
>- Display modify user information form.
>-
>- This form displays, username, create Date, usage date, usage count, identity
>policy,
>- and access policy.
>-
>- @param[in] UserIndex The index of the user in display list to modify.
>-
>-**/
>-VOID
>-ModifyUserInfo (
>- IN UINT8 UserIndex
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_PROFILE_HANDLE CurrentUser;
>- UINT32 CurrentAccessRight;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_USER_INFO_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Find the user profile to be modified.
>- //
>- mModifyUser = NULL;
>- Status = mUserManager->GetNext (mUserManager, &mModifyUser);
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>-
>- while (UserIndex > 1) {
>- Status = mUserManager->GetNext (mUserManager, &mModifyUser);
>- if (EFI_ERROR (Status)) {
>- return ;
>- }
>- UserIndex--;
>- }
>-
>- //
>- // Get user profile information.
>- //
>- GetAllUserInfo ();
>-
>- //
>- // Update user name.
>- HiiSetString (
>- mCallbackInfo->HiiHandle,
>- STRING_TOKEN (STR_USER_NAME_VAL),
>- mUserInfo.UserName,
>- NULL
>- );
>-
>- //
>- // Update create date.
>- //
>- if (mUserInfo.CreateDateExist) {
>- ResolveDate (&mUserInfo.CreateDate, STRING_TOKEN
>(STR_CREATE_DATE_VAL));
>- } else {
>- HiiSetString (
>- mCallbackInfo->HiiHandle,
>- STRING_TOKEN (STR_CREATE_DATE_VAL),
>- L"",
>- NULL
>- );
>- }
>-
>- //
>- // Add usage date.
>- //
>- if (mUserInfo.UsageDateExist) {
>- ResolveDate (&mUserInfo.UsageDate, STRING_TOKEN
>(STR_USAGE_DATE_VAL));
>- } else {
>- HiiSetString (
>- mCallbackInfo->HiiHandle,
>- STRING_TOKEN (STR_USAGE_DATE_VAL),
>- L"",
>- NULL
>- );
>- }
>-
>- //
>- // Add usage count.
>- //
>- ResolveCount ((UINT32) mUserInfo.UsageCount, STRING_TOKEN
>(STR_USAGE_COUNT_VAL));
>-
>- //
>- // Add identity policy.
>- //
>- mUserManager->Current (mUserManager, &CurrentUser);
>- if (mModifyUser == CurrentUser) {
>- ResolveIdentityPolicy (
>- mUserInfo.IdentityPolicy,
>- mUserInfo.IdentityPolicyLen,
>- STRING_TOKEN (STR_IDENTIFY_POLICY_VAL)
>- );
>- HiiCreateGotoOpCode (
>- StartOpCodeHandle, // Container for opcodes
>- FORMID_MODIFY_IP, // Target Form ID
>- STRING_TOKEN (STR_IDENTIFY_POLICY), // Prompt text
>- STRING_TOKEN (STR_IDENTIFY_POLICY_VAL), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP // Question
>ID
>- );
>- }
>-
>- //
>- // Add access policy.
>- //
>- Status = GetAccessRight (&CurrentAccessRight);
>- if (EFI_ERROR (Status)) {
>- CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- }
>-
>- if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) {
>- HiiCreateGotoOpCode (
>- StartOpCodeHandle, // Container for opcodes
>- FORMID_MODIFY_AP, // Target Form ID
>- STRING_TOKEN (STR_ACCESS_POLICY), // Prompt text
>- STRING_TOKEN (STR_NULL_STRING), // Help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP // Question
>ID
>- );
>- }
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_USER_INFO, // Form ID
>- StartOpCodeHandle, // Label
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>-
>-
>-/**
>- Get all the access policy info from current user info, and save in the global
>- variable.
>-
>-**/
>-VOID
>-ResolveAccessPolicy (
>- VOID
>- )
>-{
>- UINTN OffSet;
>- EFI_USER_INFO_ACCESS_CONTROL Control;
>- UINTN ValLen;
>- UINT8 *AccessData;
>-
>- //
>- // Set default value
>- //
>- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- mAccessInfo.AccessSetup = ACCESS_SETUP_RESTRICTED;
>- mAccessInfo.AccessBootOrder =
>EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT;
>-
>- mAccessInfo.LoadPermitLen = 0;
>- mAccessInfo.LoadForbidLen = 0;
>- mAccessInfo.ConnectPermitLen = 0;
>- mAccessInfo.ConnectForbidLen = 0;
>-
>- //
>- // Get each user access policy.
>- //
>- OffSet = 0;
>- while (OffSet < mUserInfo.AccessPolicyLen) {
>- CopyMem (&Control, mUserInfo.AccessPolicy + OffSet, sizeof (Control));
>- ValLen = Control.Size - sizeof (Control);
>- switch (Control.Type) {
>- case EFI_USER_INFO_ACCESS_ENROLL_SELF:
>- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
>- break;
>-
>- case EFI_USER_INFO_ACCESS_ENROLL_OTHERS:
>- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_OTHERS;
>- break;
>-
>- case EFI_USER_INFO_ACCESS_MANAGE:
>- mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_MANAGE;
>- break;
>-
>- case EFI_USER_INFO_ACCESS_SETUP:
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- if (CompareGuid ((EFI_GUID *) AccessData,
>&gEfiUserInfoAccessSetupNormalGuid)) {
>- mAccessInfo.AccessSetup = ACCESS_SETUP_NORMAL;
>- } else if (CompareGuid ((EFI_GUID *) AccessData,
>&gEfiUserInfoAccessSetupRestrictedGuid)) {
>- mAccessInfo.AccessSetup = ACCESS_SETUP_RESTRICTED;
>- } else if (CompareGuid ((EFI_GUID *) AccessData,
>&gEfiUserInfoAccessSetupAdminGuid)) {
>- mAccessInfo.AccessSetup = ACCESS_SETUP_ADMIN;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_BOOT_ORDER:
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- CopyMem (&mAccessInfo.AccessBootOrder, AccessData, sizeof (UINT32));
>- break;
>-
>- case EFI_USER_INFO_ACCESS_FORBID_LOAD:
>- if (mAccessInfo.LoadForbid != NULL) {
>- FreePool (mAccessInfo.LoadForbid);
>- }
>-
>- mAccessInfo.LoadForbid = AllocateZeroPool (ValLen);
>- if (mAccessInfo.LoadForbid != NULL) {
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- CopyMem (mAccessInfo.LoadForbid, AccessData, ValLen);
>- mAccessInfo.LoadForbidLen = ValLen;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_PERMIT_LOAD:
>- if (mAccessInfo.LoadPermit != NULL) {
>- FreePool (mAccessInfo.LoadPermit);
>- }
>-
>- mAccessInfo.LoadPermit = AllocateZeroPool (ValLen);
>- if (mAccessInfo.LoadPermit != NULL) {
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- CopyMem (mAccessInfo.LoadPermit, AccessData, ValLen);
>- mAccessInfo.LoadPermitLen = ValLen;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_FORBID_CONNECT:
>- if (mAccessInfo.ConnectForbid != NULL) {
>- FreePool (mAccessInfo.ConnectForbid);
>- }
>-
>- mAccessInfo.ConnectForbid = AllocateZeroPool (ValLen);
>- if (mAccessInfo.ConnectForbid != NULL) {
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- CopyMem (mAccessInfo.ConnectForbid, AccessData, ValLen);
>- mAccessInfo.ConnectForbidLen = ValLen;
>- }
>- break;
>-
>- case EFI_USER_INFO_ACCESS_PERMIT_CONNECT:
>- if (mAccessInfo.ConnectPermit != NULL) {
>- FreePool (mAccessInfo.ConnectPermit);
>- }
>-
>- mAccessInfo.ConnectPermit = AllocateZeroPool (ValLen);
>- if (mAccessInfo.ConnectPermit != NULL) {
>- AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
>- CopyMem (mAccessInfo.ConnectPermit, AccessData, ValLen);
>- mAccessInfo.ConnectPermitLen = ValLen;
>- }
>- break;
>- }
>-
>- OffSet += Control.Size;
>- }
>-}
>-
>-
>-/**
>- Find the specified info in User profile by the InfoType.
>-
>- @param[in] User Handle of the user whose information will be
>searched.
>- @param[in] InfoType The user information type to find.
>- @param[out] UserInfo Points to user information handle found.
>-
>- @retval EFI_SUCCESS Find the user information successfully.
>- @retval Others Fail to find the user information.
>-
>-**/
>-EFI_STATUS
>-FindInfoByType (
>- IN EFI_USER_PROFILE_HANDLE User,
>- IN UINT8 InfoType,
>- OUT EFI_USER_INFO_HANDLE *UserInfo
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO *Info;
>- UINTN InfoSize;
>- UINTN MemSize;
>-
>- if (UserInfo == NULL) {
>- return EFI_INVALID_PARAMETER;
>- }
>-
>- *UserInfo = NULL;
>- //
>- // Allocate user information memory.
>- //
>- MemSize = sizeof (EFI_USER_INFO) + 63;
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- //
>- // Get each user information.
>- //
>- while (TRUE) {
>- Status = mUserManager->GetNextInfo (mUserManager, User, UserInfo);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>- //
>- // Get information.
>- //
>- InfoSize = MemSize;
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- User,
>- *UserInfo,
>- Info,
>- &InfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- MemSize = InfoSize;
>- FreePool (Info);
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- User,
>- *UserInfo,
>- Info,
>- &InfoSize
>- );
>- }
>- if (Status == EFI_SUCCESS) {
>- if (Info->InfoType == InfoType) {
>- break;
>- }
>- }
>- }
>-
>- FreePool (Info);
>- return Status;
>-}
>-
>-
>-/**
>- Display modify user access policy form.
>-
>- In this form, access right, access setup and access boot order are dynamically
>- added. Load devicepath and connect devicepath are displayed too.
>-
>-**/
>-VOID
>-ModidyAccessPolicy (
>- VOID
>- )
>-{
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- VOID *OptionsOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>- VOID *DefaultOpCodeHandle;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_AP_MOD_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>-
>- //
>- // Resolve access policy information.
>- //
>- ResolveAccessPolicy ();
>-
>- //
>- // Add access right one-of-code.
>- //
>- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (OptionsOpCodeHandle != NULL);
>- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (DefaultOpCodeHandle != NULL);
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_NORMAL),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- EFI_USER_INFO_ACCESS_ENROLL_SELF
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_ENROLL),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- EFI_USER_INFO_ACCESS_ENROLL_OTHERS
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_MANAGE),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- EFI_USER_INFO_ACCESS_MANAGE
>- );
>-
>- HiiCreateDefaultOpCode (
>- DefaultOpCodeHandle,
>- EFI_HII_DEFAULT_CLASS_STANDARD,
>- EFI_IFR_NUMERIC_SIZE_1,
>- mAccessInfo.AccessRight
>- );
>-
>- HiiCreateOneOfOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP |
>KEY_MODIFY_RIGHT, // Question ID
>- 0, // VarStore ID
>- 0, // Offset in Buffer Storage
>- STRING_TOKEN (STR_ACCESS_RIGHT), // Question prompt text
>- STRING_TOKEN (STR_ACCESS_RIGHT_HELP), // Question help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value
>- OptionsOpCodeHandle, // Option Opcode list
>- DefaultOpCodeHandle // Default Opcode
>- );
>- HiiFreeOpCodeHandle (DefaultOpCodeHandle);
>- HiiFreeOpCodeHandle (OptionsOpCodeHandle);
>-
>-
>- //
>- // Add setup type one-of-code.
>- //
>- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (OptionsOpCodeHandle != NULL);
>- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (DefaultOpCodeHandle != NULL);
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_RESTRICTED),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- ACCESS_SETUP_RESTRICTED
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_NORMAL),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- ACCESS_SETUP_NORMAL
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_ADMIN),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- ACCESS_SETUP_ADMIN
>- );
>-
>- HiiCreateDefaultOpCode (
>- DefaultOpCodeHandle,
>- EFI_HII_DEFAULT_CLASS_STANDARD,
>- EFI_IFR_NUMERIC_SIZE_1,
>- mAccessInfo.AccessSetup
>- );
>-
>- HiiCreateOneOfOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP |
>KEY_MODIFY_SETUP, // Question ID
>- 0, // VarStore ID
>- 0, // Offset in Buffer Storage
>- STRING_TOKEN (STR_ACCESS_SETUP), // Question prompt text
>- STRING_TOKEN (STR_ACCESS_SETUP_HELP), // Question help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value
>- OptionsOpCodeHandle, // Option Opcode list
>- DefaultOpCodeHandle // Default Opcode
>- );
>- HiiFreeOpCodeHandle (DefaultOpCodeHandle);
>- HiiFreeOpCodeHandle (OptionsOpCodeHandle);
>-
>- //
>- // Add boot order one-of-code.
>- //
>- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (OptionsOpCodeHandle != NULL);
>- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (DefaultOpCodeHandle != NULL);
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_INSERT),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_4,
>- EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_APPEND),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_4,
>- EFI_USER_INFO_ACCESS_BOOT_ORDER_APPEND
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_REPLACE),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_4,
>- EFI_USER_INFO_ACCESS_BOOT_ORDER_REPLACE
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_NODEFAULT),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_4,
>- EFI_USER_INFO_ACCESS_BOOT_ORDER_NODEFAULT
>- );
>-
>- HiiCreateDefaultOpCode (
>- DefaultOpCodeHandle,
>- EFI_HII_DEFAULT_CLASS_STANDARD,
>- EFI_IFR_NUMERIC_SIZE_4,
>- mAccessInfo.AccessBootOrder
>- );
>-
>- HiiCreateOneOfOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP |
>KEY_MODIFY_BOOT, // Question ID
>- 0, // VarStore ID
>- 0, // Offset in Buffer Storage
>- STRING_TOKEN (STR_BOOR_ORDER), // Question prompt text
>- STRING_TOKEN (STR_BOOT_ORDER_HELP), // Question help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value
>- OptionsOpCodeHandle, // Option Opcode list
>- DefaultOpCodeHandle // Default Opcode
>- );
>- HiiFreeOpCodeHandle (DefaultOpCodeHandle);
>- HiiFreeOpCodeHandle (OptionsOpCodeHandle);
>-
>- //
>- // Update Form.
>- //
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_MODIFY_AP, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>-
>-
>-/**
>- Expand access policy memory size.
>-
>- @param[in] ValidLen The valid access policy length.
>- @param[in] ExpandLen The length that is needed to expand.
>-
>-**/
>-VOID
>-ExpandMemory (
>- IN UINTN ValidLen,
>- IN UINTN ExpandLen
>- )
>-{
>- UINT8 *Mem;
>- UINTN Len;
>-
>- //
>- // Expand memory.
>- //
>- Len = mUserInfo.AccessPolicyLen + (ExpandLen / 64 + 1) * 64;
>- Mem = AllocateZeroPool (Len);
>- ASSERT (Mem != NULL);
>-
>- if (mUserInfo.AccessPolicy != NULL) {
>- CopyMem (Mem, mUserInfo.AccessPolicy, ValidLen);
>- FreePool (mUserInfo.AccessPolicy);
>- }
>-
>- mUserInfo.AccessPolicy = Mem;
>- mUserInfo.AccessPolicyLen = Len;
>-}
>-
>-
>-/**
>- Get the username from user input, and update username string in the Hii
>- database with it.
>-
>-**/
>-VOID
>-ModifyUserName (
>- VOID
>- )
>-{
>- EFI_STATUS Status;
>- CHAR16 UserName[USER_NAME_LENGTH];
>- UINTN Len;
>- EFI_INPUT_KEY Key;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>- EFI_USER_PROFILE_HANDLE TempUser;
>-
>- //
>- // Get the new user name.
>- //
>- Len = sizeof (UserName);
>- Status = GetUserNameInput (&Len, UserName);
>- if (EFI_ERROR (Status)) {
>- if (Status != EFI_ABORTED) {
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"Failed To Get User Name.",
>- L"",
>- L"Please Press Any Key to Continue ...",
>- NULL
>- );
>- }
>- return ;
>- }
>-
>- //
>- // Check whether the username had been used or not.
>- //
>- Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + Len);
>- if (Info == NULL) {
>- return ;
>- }
>-
>- Info->InfoType = EFI_USER_INFO_NAME_RECORD;
>- Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
>- EFI_USER_INFO_PUBLIC |
>- EFI_USER_INFO_EXCLUSIVE;
>- Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) + Len);
>- CopyMem ((UINT8 *) (Info + 1), UserName, Len);
>-
>- TempUser = NULL;
>- Status = mUserManager->Find (
>- mUserManager,
>- &TempUser,
>- NULL,
>- Info,
>- Info->InfoSize
>- );
>- if (!EFI_ERROR (Status)) {
>- CreatePopUp (
>- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
>- &Key,
>- L"The User Name Had Been Used.",
>- L"",
>- L"Please Use Other User Name",
>- NULL
>- );
>- FreePool (Info);
>- return ;
>- }
>-
>- //
>- // Update username display in the form.
>- //
>- CopyMem (mUserInfo.UserName, UserName, Len);
>- HiiSetString (
>- mCallbackInfo->HiiHandle,
>- STRING_TOKEN (STR_USER_NAME_VAL),
>- mUserInfo.UserName,
>- NULL
>- );
>-
>- //
>- // Save the user name.
>- //
>- Status = FindInfoByType (mModifyUser, EFI_USER_INFO_NAME_RECORD,
>&UserInfo);
>- if (!EFI_ERROR (Status)) {
>- mUserManager->SetInfo (
>- mUserManager,
>- mModifyUser,
>- &UserInfo,
>- Info,
>- Info->InfoSize
>- );
>- }
>- FreePool (Info);
>-}
>-
>-
>-/**
>- Display the form of the modifying user identity policy.
>-
>-**/
>-VOID
>-ModifyIdentityPolicy (
>- VOID
>- )
>-{
>- UINTN Index;
>- CHAR16 *ProvStr;
>- EFI_STRING_ID ProvID;
>- EFI_HII_HANDLE HiiHandle;
>- VOID *OptionsOpCodeHandle;
>- VOID *StartOpCodeHandle;
>- VOID *EndOpCodeHandle;
>- EFI_IFR_GUID_LABEL *StartLabel;
>- EFI_IFR_GUID_LABEL *EndLabel;
>-
>- //
>- // Initialize the container for dynamic opcodes.
>- //
>- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (StartOpCodeHandle != NULL);
>-
>- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (EndOpCodeHandle != NULL);
>-
>- //
>- // Create Hii Extend Label OpCode.
>- //
>- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- StartOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- StartLabel->Number = LABEL_IP_MOD_FUNC;
>-
>- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
>- EndOpCodeHandle,
>- &gEfiIfrTianoGuid,
>- NULL,
>- sizeof (EFI_IFR_GUID_LABEL)
>- );
>- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
>- EndLabel->Number = LABEL_END;
>-
>- //
>- // Add credential providers
>- //.
>- if (mProviderInfo->Count > 0) {
>- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (OptionsOpCodeHandle != NULL);
>-
>- //
>- // Add credential provider Option OpCode.
>- //
>- for (Index = 0; Index < mProviderInfo->Count; Index++) {
>- mProviderInfo->Provider[Index]->Title (
>- mProviderInfo->Provider[Index],
>- &HiiHandle,
>- &ProvID
>- );
>- ProvStr = HiiGetString (HiiHandle, ProvID, NULL);
>- ProvID = HiiSetString (mCallbackInfo->HiiHandle, 0, ProvStr, NULL);
>- FreePool (ProvStr);
>- if (ProvID == 0) {
>- return ;
>- }
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- ProvID,
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- (UINT8) Index
>- );
>- }
>-
>- HiiCreateOneOfOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP |
>KEY_MODIFY_PROV, // Question ID
>- 0, // VarStore ID
>- 0, // Offset in Buffer Storage
>- STRING_TOKEN (STR_PROVIDER), // Question prompt text
>- STRING_TOKEN (STR_PROVIDER_HELP), // Question help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value
>- OptionsOpCodeHandle, // Option Opcode list
>- NULL // Default Opcode is NULl
>- );
>-
>- HiiFreeOpCodeHandle (OptionsOpCodeHandle);
>- }
>-
>- //
>- // Add logical connector Option OpCode.
>- //
>- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
>- ASSERT (OptionsOpCodeHandle != NULL);
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_AND_CON),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- 0
>- );
>-
>- HiiCreateOneOfOptionOpCode (
>- OptionsOpCodeHandle,
>- STRING_TOKEN (STR_OR_CON),
>- 0,
>- EFI_IFR_NUMERIC_SIZE_1,
>- 1
>- );
>-
>- HiiCreateOneOfOpCode (
>- StartOpCodeHandle, // Container for dynamic created opcodes
>- KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP |
>KEY_MODIFY_CONN, // Question ID
>- 0, // VarStore ID
>- 0, // Offset in Buffer Storage
>- STRING_TOKEN (STR_CONNECTOR), // Question prompt text
>- STRING_TOKEN (STR_CONNECTOR_HELP), // Question help text
>- EFI_IFR_FLAG_CALLBACK, // Question flag
>- EFI_IFR_NUMERIC_SIZE_1, // Data type of Question Value
>- OptionsOpCodeHandle, // Option Opcode list
>- NULL // Default Opcode is NULl
>- );
>-
>- HiiFreeOpCodeHandle (OptionsOpCodeHandle);
>-
>- //
>- // Update identity policy in the form.
>- //
>- ResolveIdentityPolicy (
>- mUserInfo.IdentityPolicy,
>- mUserInfo.IdentityPolicyLen,
>- STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE)
>- );
>-
>- if (mUserInfo.NewIdentityPolicy != NULL) {
>- FreePool (mUserInfo.NewIdentityPolicy);
>- mUserInfo.NewIdentityPolicy = NULL;
>- mUserInfo.NewIdentityPolicyLen = 0;
>- mUserInfo.NewIdentityPolicyModified = FALSE;
>- }
>- mProviderChoice = 0;
>- mConncetLogical = 0;
>-
>- HiiUpdateForm (
>- mCallbackInfo->HiiHandle, // HII handle
>- &gUserProfileManagerGuid, // Formset GUID
>- FORMID_MODIFY_IP, // Form ID
>- StartOpCodeHandle, // Label for where to insert opcodes
>- EndOpCodeHandle // Replace data
>- );
>-
>- HiiFreeOpCodeHandle (StartOpCodeHandle);
>- HiiFreeOpCodeHandle (EndOpCodeHandle);
>-}
>-
>-
>-/**
>- Get current user's access right.
>-
>- @param[out] AccessRight Points to the buffer used for user's access right.
>-
>- @retval EFI_SUCCESS Get current user access right successfully.
>- @retval others Fail to get current user access right.
>-
>-**/
>-EFI_STATUS
>-GetAccessRight (
>- OUT UINT32 *AccessRight
>- )
>-{
>- EFI_STATUS Status;
>- EFI_USER_INFO_HANDLE UserInfo;
>- EFI_USER_INFO *Info;
>- UINTN InfoSize;
>- UINTN MemSize;
>- EFI_USER_INFO_ACCESS_CONTROL Access;
>- EFI_USER_PROFILE_HANDLE CurrentUser;
>- UINTN TotalLen;
>- UINTN CheckLen;
>-
>- //
>- // Allocate user information memory.
>- //
>- MemSize = sizeof (EFI_USER_INFO) + 63;
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>-
>- //
>- // Get user access information.
>- //
>- UserInfo = NULL;
>- mUserManager->Current (mUserManager, &CurrentUser);
>- while (TRUE) {
>- InfoSize = MemSize;
>- //
>- // Get next user information.
>- //
>- Status = mUserManager->GetNextInfo (mUserManager, CurrentUser,
>&UserInfo);
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- CurrentUser,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- if (Status == EFI_BUFFER_TOO_SMALL) {
>- MemSize = InfoSize;
>- FreePool (Info);
>- Info = AllocateZeroPool (MemSize);
>- if (Info == NULL) {
>- return EFI_OUT_OF_RESOURCES;
>- }
>- Status = mUserManager->GetInfo (
>- mUserManager,
>- CurrentUser,
>- UserInfo,
>- Info,
>- &InfoSize
>- );
>- }
>- if (EFI_ERROR (Status)) {
>- break;
>- }
>-
>- //
>- // Check user information.
>- //
>- if (Info->InfoType == EFI_USER_INFO_ACCESS_POLICY_RECORD) {
>- TotalLen = Info->InfoSize - sizeof (EFI_USER_INFO);
>- CheckLen = 0;
>- //
>- // Get specified access information.
>- //
>- while (CheckLen < TotalLen) {
>- CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));
>- if ((Access.Type == EFI_USER_INFO_ACCESS_ENROLL_SELF) ||
>- (Access.Type == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ||
>- (Access.Type == EFI_USER_INFO_ACCESS_MANAGE)
>- ) {
>- *AccessRight = Access.Type;
>- FreePool (Info);
>- return EFI_SUCCESS;
>- }
>- CheckLen += Access.Size;
>- }
>- }
>- }
>- FreePool (Info);
>- return EFI_NOT_FOUND;
>-}
>-
>--
>2.16.2.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2019-01-09 1:38 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-09 1:09 [PATCH] SecurityPkg: Remove code under UserIdentification folder chenche4
2019-01-09 1:38 ` Gao, Liming [this message]
2019-01-09 1:54 ` Chen, Chen A
2019-01-09 2:17 ` Gao, Liming
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E3ADF77@SHSMSX152.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox