[AMD Official Use Only - General]
> -----Original Message----- > From: Nickle Wang <nick...@nvidia.com> > Sent: Thursday, March 9, 2023 1:49 PM > To: Chang, Abner <abner.ch...@amd.com>; devel@edk2.groups.io > Cc: Igor Kulchytskyy <ig...@ami.com>; Nick Ramirez > <nrami...@nvidia.com> > Subject: RE: [PATCH] RedfishPkg/RedfishPlatformCredentialIpmiLib: IPMI > implementation > > Caution: This message originated from an External Source. Use proper > caution when opening attachments, clicking links, or responding. > > > Hi Abner, > > Thanks for your review. > > >> + // > >> + // Get bootstrap credential from variable first // Status = > >> + GetBootstrapAccountCredentialsFromVariable (*UserId, *Password); > >> + if (!EFI_ERROR (Status)) { > >> + return EFI_SUCCESS; > >> + } > > I think the process should keep going if the error status is EFI_NOT_FOUND? > Besides this, all others look fine to me. > > This function turns EFI_SUCCESS when we can get credentials from variable. > If it failed (including EFI_NOT_FOUND), the process will move forward and > get credentials via IPMI command. Ah I see. My mistake of reading the code. > > > BTW, how about the conclusions we had in the previous discussion? Which > is to probe "/redfish/v1/Systems" to get the supported authentication > method? Is this idea is valid? > > This must be done in RedfishCredentailDxe driver. I will create separated > patch to address this comment. Got it. Thanks Abner > > Regards, > Nickle > > -----Original Message----- > From: Chang, Abner <abner.ch...@amd.com> > Sent: Thursday, March 9, 2023 1:23 PM > To: Nickle Wang <nick...@nvidia.com>; devel@edk2.groups.io > Cc: Igor Kulchytskyy <ig...@ami.com>; Nick Ramirez > <nrami...@nvidia.com> > Subject: RE: [PATCH] RedfishPkg/RedfishPlatformCredentialIpmiLib: IPMI > implementation > > External email: Use caution opening links or attachments > > > [AMD Official Use Only - General] > > Hi Nickle, > My comments in below, > > > -----Original Message----- > > From: Nickle Wang <nick...@nvidia.com> > > Sent: Wednesday, March 8, 2023 3:21 PM > > To: devel@edk2.groups.io > > Cc: Chang, Abner <abner.ch...@amd.com>; Igor Kulchytskyy > > <ig...@ami.com>; Nick Ramirez <nrami...@nvidia.com> > > Subject: [PATCH] RedfishPkg/RedfishPlatformCredentialIpmiLib: IPMI > > implementation > > > > Caution: This message originated from an External Source. Use proper > > caution when opening attachments, clicking links, or responding. > > > > > > This library follows Redfish Host Interface specification and use IPMI > > command to get bootstrap account credential(NetFn 2Ch, Command 02h) > > from BMC. RedfishHostInterfaceDxe will use this credential for the > > following communication between BIOS and BMC. > > > > Signed-off-by: Nickle Wang <nick...@nvidia.com> > > Cc: Abner Chang <abner.ch...@amd.com> > > Cc: Igor Kulchytskyy <ig...@ami.com> > > Cc: Nick Ramirez <nrami...@nvidia.com> > > --- > > .../RedfishPlatformCredentialIpmiLib.c | 443 ++++++++++++++++++ > > .../RedfishPlatformCredentialIpmiLib.h | 86 ++++ > > .../RedfishPlatformCredentialIpmiLib.inf | 42 ++ > > RedfishPkg/RedfishPkg.dec | 7 + > > RedfishPkg/RedfishPkg.dsc | 2 + > > 5 files changed, 580 insertions(+) > > create mode 100644 > > > RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCreden > > ti > > alIpmiLib.c > > create mode 100644 > > > RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCreden > > ti > > alIpmiLib.h > > create mode 100644 > > > RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCreden > > ti > > alIpmiLib.inf > > > > diff --git > > a/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.c > > b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.c > > new file mode 100644 > > index 0000000000..2706b8508b > > --- /dev/null > > +++ b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatform > > +++ Cr > > +++ edentialIpmiLib.c > > @@ -0,0 +1,443 @@ > > +/** @file > > + Implementation of getting bootstrap credential via IPMI. > > + > > + Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > + @par Specification Reference: > > + - Redfish Host Interface Specification > > + > > > +(https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fw > w > > > +w.dmtf.org%2Fsites%2Fdefault%2Ffiles%2Fstandards%2Fdocuments%2FDS > P027 > > > +0&data=05%7C01%7Cnicklew%40nvidia.com%7C623e0d3c9ed04505bb0e08 > db205e5 > > > +bc6%7C43083d15727340c1b7db39efd9ccc17a%7C0%7C0%7C63813936186784 > 1554%7 > > > +CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLC > JBTiI6Ik > > > +1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=SHkhXpaxboVMDD > WipEgzgNg5TN > > +54lzWAs8Xn%2F8T1cNk%3D&reserved=0 > > _1 > > +.3.0.pdf) > > +**/ > > + > > +#include "RedfishPlatformCredentialIpmiLib.h" > > + > > +// > > +// Global flag of controlling credential service // BOOLEAN > > +mRedfishServiceStopped = FALSE; > > + > > +/** > > + Notify the Redfish service provide to stop provide configuration > > +service to > > this platform. > > + > > + This function should be called when the platform is about to leave > > + the safe > > environment. > > + It will notify the Redfish service provider to abort all login > > + session, and prohibit further login with original auth info. > > + GetAuthInfo() will return EFI_UNSUPPORTED once this function is > > returned. > > + > > + @param[in] This Pointer to > > EDKII_REDFISH_CREDENTIAL_PROTOCOL instance. > > + @param[in] ServiceStopType Reason of stopping Redfish service. > > + > > + @retval EFI_SUCCESS Service has been stoped successfully. > > + @retval EFI_INVALID_PARAMETER This is NULL. > > + @retval Others Some error happened. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +LibStopRedfishService ( > > + IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This, > > + IN EDKII_REDFISH_CREDENTIAL_STOP_SERVICE_TYPE > ServiceStopType > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + if ((ServiceStopType <= ServiceStopTypeNone) || (ServiceStopType >= > > ServiceStopTypeMax)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Only stop credential service after leaving BIOS // if > > + (ServiceStopType != ServiceStopTypeExitBootService) { > > + return EFI_UNSUPPORTED; > > + } > > + > > + // > > + // Raise flag first > > + // > > + mRedfishServiceStopped = TRUE; > > + > > + // > > + // Notify BMC to disable credential bootstrapping support. > > + // > > + if (PcdGetBool (PcdRedfishDisableBootstrapCredentialService)) { > > + Status = GetBootstrapAccountCredentials (TRUE, NULL, NULL); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: fail to disable bootstrap credential: > > + %r\n", > > __FUNCTION__, Status)); > > + return Status; > > + } > > + } > > + > > + // > > + // Delete cached variable > > + // > > + Status = SetBootstrapAccountCredentialsToVariable (NULL, NULL, > > + TRUE); if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: fail to remove bootstrap credential: > > + %r\n", __FUNCTION__, Status)); } > > + > > + DEBUG ((DEBUG_INFO, "%a: bootstrap credential service stopped\n", > > + __FUNCTION__)); > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Notification of Exit Boot Service. > > + > > + @param[in] This Pointer to EDKII_REDFISH_CREDENTIAL_PROTOCOL. > > +**/ > > +VOID > > +EFIAPI > > +LibCredentialExitBootServicesNotify ( > > + IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This > > + ) > > +{ > > + // > > + // Stop the credential support when system is about to enter OS. > > + // > > + LibStopRedfishService (This, ServiceStopTypeExitBootService); } > > + > > +/** > > + Notification of End of DXe. > > + > > + @param[in] This Pointer to EDKII_REDFISH_CREDENTIAL_PROTOCOL. > > +**/ > > +VOID > > +EFIAPI > > +LibCredentialEndOfDxeNotify ( > > + IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This > > + ) > > +{ > > + // > > + // Do nothing now. > > + // We can stop credential support when system reach end-of-dxe for > > security reason. > > + // > > +} > > + > > +/** > > + Function to retrieve temporary user credentials for the UEFI > > +redfish client. This function can > > + also disable bootstrap credential service in BMC. > > + > > + @param[in] DisableBootstrapControl > > + TRUE - Tell the BMC to disable the > > bootstrap credential > > + service to ensure no one else > > gains credentials > > + FALSE Allow the bootstrap > > + credential service to continue @param[in,out] BootstrapUsername > > + A pointer to a Ascii encoded > > + string for the credential > > username > > + When DisableBootstrapControl is > > + TRUE, this pointer can be NULL > > + > > + @param[in,out] BootstrapPassword > > + A pointer to a Ascii encoded > > + string for the credential > > password > > + When DisableBootstrapControl is > > + TRUE, this pointer can be NULL > > + > > + @retval EFI_SUCCESS Credentials were successfully > > fetched and > > returned. When DisableBootstrapControl > > + is set to TRUE, the bootstrap > > + credential service is > > disabled successfully. > > + @retval EFI_INVALID_PARAMETER BootstrapUsername or > > BootstrapPassword is NULL when DisableBootstrapControl > > + is set to FALSE > > + @retval EFI_DEVICE_ERROR An IPMI failure occurred > > +**/ > > +EFI_STATUS > > +GetBootstrapAccountCredentials ( > > + IN BOOLEAN DisableBootstrapControl, > > + IN OUT CHAR8 *BootstrapUsername, OPTIONAL > > + IN OUT CHAR8 *BootstrapPassword OPTIONAL > > + ) > > +{ > > + EFI_STATUS Status; > > + IPMI_BOOTSTRAP_CREDENTIALS_COMMAND_DATA CommandData; > > + IPMI_BOOTSTRAP_CREDENTIALS_RESULT_RESPONSE ResponseData; > > + UINT32 ResponseSize; > > + > > + // > > + // NULL buffer check > > + // > > + if (!DisableBootstrapControl && ((BootstrapUsername == NULL) || > > (BootstrapPassword == NULL))) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + DEBUG ((DEBUG_VERBOSE, "%a: Disable bootstrap control: 0x%x\n", > > + __FUNCTION__, DisableBootstrapControl)); > > + > > + // > > + // IPMI callout to NetFn 2C, command 02 > > + // Request data: > > + // Byte 1: REDFISH_IPMI_GROUP_EXTENSION > > + // Byte 2: DisableBootstrapControl > > + // > > + CommandData.GroupExtensionId = > > REDFISH_IPMI_GROUP_EXTENSION; > > + CommandData.DisableBootstrapControl = (DisableBootstrapControl ? > > + REDFISH_IPMI_BOOTSTRAP_CREDENTIAL_DISABLE : > > + REDFISH_IPMI_BOOTSTRAP_CREDENTIAL_ENABLE); > > + > > + ResponseSize = sizeof (ResponseData); > > + > > + // > > + // Response data: > > + // Byte 1 : Completion code > > + // Byte 2 : REDFISH_IPMI_GROUP_EXTENSION > > + // Byte 3-18 : Username > > + // Byte 19-34: Password > > + // > > + Status = IpmiSubmitCommand ( > > + IPMI_NETFN_GROUP_EXT, > > + REDFISH_IPMI_GET_BOOTSTRAP_CREDENTIALS_CMD, > > + (UINT8 *)&CommandData, > > + sizeof (CommandData), > > + (UINT8 *)&ResponseData, > > + &ResponseSize > > + ); > > + > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: IPMI transaction failure. Returning\n", > > __FUNCTION__)); > > + return Status; > > + } else { > > + if (ResponseData.CompletionCode != IPMI_COMP_CODE_NORMAL) { > > + if (ResponseData.CompletionCode == > > REDFISH_IPMI_COMP_CODE_BOOTSTRAP_CREDENTIAL_DISABLED) { > > + DEBUG ((DEBUG_ERROR, "%a: bootstrap credential support was > > disabled\n", __FUNCTION__)); > > + return EFI_ACCESS_DENIED; > > + } > > + > > + DEBUG ((DEBUG_ERROR, "%a: Completion code = 0x%x. Returning\n", > > __FUNCTION__, ResponseData.CompletionCode)); > > + return EFI_PROTOCOL_ERROR; > > + } else if (ResponseData.GroupExtensionId != > > REDFISH_IPMI_GROUP_EXTENSION) { > > + DEBUG ((DEBUG_ERROR, "%a: Group Extension Response = 0x%x. > > Returning\n", __FUNCTION__, ResponseData.GroupExtensionId)); > > + return EFI_DEVICE_ERROR; > > + } else { > > + if (BootstrapUsername != NULL) { > > + CopyMem (BootstrapUsername, ResponseData.Username, > > USERNAME_MAX_LENGTH); > > + // > > + // Manually append null-terminator in case 16 characters > > + username > > returned. > > + // > > + BootstrapUsername[USERNAME_MAX_LENGTH] = '\0'; > > + } > > + > > + if (BootstrapPassword != NULL) { > > + CopyMem (BootstrapPassword, ResponseData.Password, > > PASSWORD_MAX_LENGTH); > > + // > > + // Manually append null-terminator in case 16 characters > > + password > > returned. > > + // > > + BootstrapPassword[PASSWORD_MAX_LENGTH] = '\0'; > > + } > > + } > > + } > > + > > + DEBUG ((DEBUG_INFO, "%a: get bootstrap credential via IPMI: %r\n", > > + __FUNCTION__, Status)); > > + > > + return Status; > > +} > > + > > +/** > > + Function to retrieve temporary user credentials from cached boot > > +time > > variable. > > + > > + @param[in,out] BootstrapUsername A pointer to a Ascii encoded string > > for the credential username > > + @param[in,out] BootstrapPassword A pointer to a Ascii encoded string > > for the credential password > > + > > + @retval EFI_SUCCESS Credentials were successfully > > fetched and > > returned > > + @retval EFI_INVALID_PARAMETER BootstrapUsername or > > BootstrapPassword is NULL > > + @retval EFI_NOT_FOUND No variable found for account and > > credentials > > +**/ > > +EFI_STATUS > > +GetBootstrapAccountCredentialsFromVariable ( > > + IN OUT CHAR8 *BootstrapUsername, > > + IN OUT CHAR8 *BootstrapPassword > > + ) > > +{ > > + EFI_STATUS Status; > > + BOOTSTRAP_CREDENTIALS_VARIABLE *CredentialVariable; > > + VOID *Data; > > + UINTN DataSize; > > + > > + if ((BootstrapUsername == NULL) || (BootstrapPassword == NULL)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + DataSize = 0; > > + Status = GetVariable2 ( > > + CREDENTIAL_VARIABLE_NAME, > > + &gEfiRedfishVariableGuid, > > + (VOID *)&Data, > > + &DataSize > > + ); > > + if (EFI_ERROR (Status)) { > > + return EFI_NOT_FOUND; > > + } > > + > > + if (DataSize != sizeof (BOOTSTRAP_CREDENTIALS_VARIABLE)) { > > + DEBUG ((DEBUG_ERROR, "%a: data corruption. returned size: %d != > > structure size: %d\n", __FUNCTION__, DataSize, sizeof > > (BOOTSTRAP_CREDENTIALS_VARIABLE))); > > + return EFI_NOT_FOUND; > > + } > > + > > + CredentialVariable = (BOOTSTRAP_CREDENTIALS_VARIABLE *)Data; > > + > > + AsciiStrCpyS (BootstrapUsername, USERNAME_MAX_SIZE, > > + CredentialVariable->Username); AsciiStrCpyS (BootstrapPassword, > > + PASSWORD_MAX_SIZE, CredentialVariable->Password); > > + > > + ZeroMem (CredentialVariable->Username, USERNAME_MAX_SIZE); > > ZeroMem > > + (CredentialVariable->Password, PASSWORD_MAX_SIZE); > > + > > + FreePool (Data); > > + > > + DEBUG ((DEBUG_INFO, "%a: get bootstrap credential from variable\n", > > + __FUNCTION__)); > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + Function to save temporary user credentials into boot time variable. > > +When DeleteVariable is True, > > + this function delete boot time variable. > > + > > + @param[in] BootstrapUsername A pointer to a Ascii encoded string > for > > the credential username. > > + @param[in] BootstrapPassword A pointer to a Ascii encoded string > > for > > the credential password. > > + @param[in] DeleteVariable True to remove boot time variable. > > False > > otherwise. > > + > > + @retval EFI_SUCCESS Credentials were successfully saved. > > + @retval EFI_INVALID_PARAMETER BootstrapUsername or > > BootstrapPassword is NULL > > + @retval Others Error occurs > > +**/ > > +EFI_STATUS > > +SetBootstrapAccountCredentialsToVariable ( > > + IN CHAR8 *BootstrapUsername, OPTIONAL > > + IN CHAR8 *BootstrapPassword, OPTIONAL > > + IN BOOLEAN DeleteVariable > > + ) > > +{ > > + EFI_STATUS Status; > > + BOOTSTRAP_CREDENTIALS_VARIABLE CredentialVariable; > > + VOID *Data; > > + > > + if (!DeleteVariable && ((BootstrapUsername == NULL) || > > (BootstrapUsername[0] == '\0'))) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (!DeleteVariable && ((BootstrapPassword == NULL) || > > (BootstrapPassword[0] == '\0'))) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Delete variable > > + // > > + if (DeleteVariable) { > > + Status = GetVariable2 ( > > + CREDENTIAL_VARIABLE_NAME, > > + &gEfiRedfishVariableGuid, > > + (VOID *)&Data, > > + NULL > > + ); > > + if (!EFI_ERROR (Status)) { > > + FreePool (Data); > > + gRT->SetVariable (CREDENTIAL_VARIABLE_NAME, > > &gEfiRedfishVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, NULL); > > + } > > + > > + return EFI_SUCCESS; > > + } > > + > > + ZeroMem (CredentialVariable.Username, USERNAME_MAX_SIZE); > > ZeroMem > > + (CredentialVariable.Password, PASSWORD_MAX_SIZE); > > + > > + AsciiStrCpyS (CredentialVariable.Username, USERNAME_MAX_SIZE, > > + BootstrapUsername); AsciiStrCpyS (CredentialVariable.Password, > > + PASSWORD_MAX_SIZE, BootstrapPassword); > > + > > + // > > + // Check if variable exists already. If yes, remove it first. > > + // > > + Status = GetVariable2 ( > > + CREDENTIAL_VARIABLE_NAME, > > + &gEfiRedfishVariableGuid, > > + (VOID *)&Data, > > + NULL > > + ); > > + if (!EFI_ERROR (Status)) { > > + FreePool (Data); > > + gRT->SetVariable (CREDENTIAL_VARIABLE_NAME, > > + &gEfiRedfishVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, 0, > NULL); > > + } > > + > > + Status = gRT->SetVariable (CREDENTIAL_VARIABLE_NAME, > > + &gEfiRedfishVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS, sizeof > > + (BOOTSTRAP_CREDENTIALS_VARIABLE), (VOID *)&CredentialVariable); > > + > > + ZeroMem (CredentialVariable.Username, USERNAME_MAX_SIZE); > > ZeroMem > > + (CredentialVariable.Password, PASSWORD_MAX_SIZE); > > + > > + return Status; > > +} > > + > > +/** > > + Retrieve platform's Redfish authentication information. > > + > > + This functions returns the Redfish authentication method together > > + with the user Id and password. > > + - For AuthMethodNone, the UserId and Password could be used for > > + HTTP > > header authentication > > + as defined by RFC7235. > > + - For AuthMethodRedfishSession, the UserId and Password could be > > + used > > for Redfish > > + session login as defined by Redfish API specification (DSP0266). > > + > > + Callers are responsible for and freeing the returned string storage. > > + > > + @param[in] This Pointer to > > EDKII_REDFISH_CREDENTIAL_PROTOCOL instance. > > + @param[out] AuthMethod Type of Redfish authentication method. > > + @param[out] UserId The pointer to store the returned UserId > > string. > > + @param[out] Password The pointer to store the returned > Password > > string. > > + > > + @retval EFI_SUCCESS Get the authentication information > > successfully. > > + @retval EFI_ACCESS_DENIED SecureBoot is disabled after EndOfDxe. > > + @retval EFI_INVALID_PARAMETER This or AuthMethod or UserId or > > Password is NULL. > > + @retval EFI_OUT_OF_RESOURCES There are not enough memory > > resources. > > + @retval EFI_UNSUPPORTED Unsupported authentication method is > > found. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +LibCredentialGetAuthInfo ( > > + IN EDKII_REDFISH_CREDENTIAL_PROTOCOL *This, > > + OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod, > > + OUT CHAR8 **UserId, > > + OUT CHAR8 **Password > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + if ((AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + *UserId = NULL; > > + *Password = NULL; > > + > > + if (mRedfishServiceStopped) { > > + DEBUG ((DEBUG_ERROR, "%a: credential service is stopped due to > > security reason\n", __FUNCTION__)); > > + return EFI_ACCESS_DENIED; > > + } > > + > > + *AuthMethod = AuthMethodHttpBasic; > > + > > + *UserId = AllocateZeroPool (sizeof (CHAR8) * USERNAME_MAX_SIZE); if > > + (*UserId == NULL) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + *Password = AllocateZeroPool (sizeof (CHAR8) * PASSWORD_MAX_SIZE); > > + if (*Password == NULL) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + > > + // > > + // Get bootstrap credential from variable first // Status = > > + GetBootstrapAccountCredentialsFromVariable (*UserId, *Password); if > > + (!EFI_ERROR (Status)) { > > + return EFI_SUCCESS; > > + } > I think the process should keep going if the error status is EFI_NOT_FOUND? > Besides this, all others look fine to me. > > BTW, how about the conclusions we had in the previous discussion? Which is > to probe "/redfish/v1/Systems" to get the supported authentication > method? Is this idea is valid? > Thanks > Abner > > > > + > > + // > > + // Make a IPMI query > > + // > > + Status = GetBootstrapAccountCredentials (FALSE, *UserId, > > + *Password); if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: fail to get bootstrap credential: > > + %r\n", > > __FUNCTION__, Status)); > > + return Status; > > + } > > + > > + Status = SetBootstrapAccountCredentialsToVariable (*UserId, > > + *Password, FALSE); if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "%a: fail to cache bootstrap credential: > > + %r\n", __FUNCTION__, Status)); } > > + > > + return EFI_SUCCESS; > > +} > > diff --git > > a/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.h > > b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.h > > new file mode 100644 > > index 0000000000..5325767eab > > --- /dev/null > > +++ b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatform > > +++ Cr > > +++ edentialIpmiLib.h > > @@ -0,0 +1,86 @@ > > +/** @file > > + Header file for RedfishPlatformCredentialIpmiLib. > > + > > + Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#ifndef REDFISH_PLATFORM_CREDENTIAL_IPMI_LIB_H_ > > +#define REDFISH_PLATFORM_CREDENTIAL_IPMI_LIB_H_ > > + > > +#include <Uefi.h> > > +#include <IndustryStandard/Ipmi.h> > > +#include <IndustryStandard/RedfishHostInterfaceIpmi.h> > > + > > +#include <Protocol/EdkIIRedfishCredential.h> > > + > > +#include <Library/BaseLib.h> > > +#include <Library/BaseMemoryLib.h> > > +#include <Library/DebugLib.h> > > +#include <Library/IpmiLib.h> > > +#include <Library/MemoryAllocationLib.h> #include > > +<Library/RedfishCredentialLib.h> #include <Library/UefiLib.h> > > +#include <Library/UefiRuntimeServicesTableLib.h> > > + > > +#define CREDENTIAL_VARIABLE_NAME L"Partstooblaitnederc" > > + > > +/// > > +/// The bootstrap credential keeping in UEFI variable /// typedef > > +struct { > > + CHAR8 Username[USERNAME_MAX_SIZE]; > > + CHAR8 Password[PASSWORD_MAX_SIZE]; > > +} BOOTSTRAP_CREDENTIALS_VARIABLE; > > + > > +/** > > + Function to retrieve temporary user credentials for the UEFI > > +redfish client. This function can > > + also disable bootstrap credential service in BMC. > > + > > + @param[in] DisableBootstrapControl > > + TRUE - Tell the BMC to disable the > > bootstrap credential > > + service to ensure no one else > > gains credentials > > + FALSE Allow the bootstrap > > + credential service to continue @param[out] BootstrapUsername > > + A pointer to a Ascii encoded > > + string for the credential > > username > > + When DisableBootstrapControl is > > + TRUE, this pointer can be NULL > > + > > + @param[out] BootstrapPassword > > + A pointer to a Ascii encoded > > + string for the credential > > password > > + When DisableBootstrapControl is > > + TRUE, this pointer can be NULL > > + > > + @retval EFI_SUCCESS Credentials were successfully > > fetched and > > returned. When DisableBootstrapControl > > + is set to TRUE, the bootstrap > > + credential service is > > disabled successfully. > > + @retval EFI_INVALID_PARAMETER BootstrapUsername or > > BootstrapPassword is NULL when DisableBootstrapControl > > + is set to FALSE > > + @retval EFI_DEVICE_ERROR An IPMI failure occurred > > +**/ > > +EFI_STATUS > > +GetBootstrapAccountCredentials ( > > + IN BOOLEAN DisableBootstrapControl, > > + IN OUT CHAR8 *BootstrapUsername, > > + IN OUT CHAR8 *BootstrapPassword > > + ); > > + > > +/** > > + Function to save temporary user credentials into boot time variable. > > +When DeleteVariable is True, > > + this function delete boot time variable. > > + > > + @param[in] BootstrapUsername A pointer to a Ascii encoded string > for > > the credential username. > > + @param[in] BootstrapPassword A pointer to a Ascii encoded string > > for > > the credential password. > > + @param[in] DeleteVariable True to remove boot time variable. > > False > > otherwise. > > + > > + @retval EFI_SUCCESS Credentials were successfully saved. > > + @retval EFI_INVALID_PARAMETER BootstrapUsername or > > BootstrapPassword is NULL > > + @retval Others Error occurs > > +**/ > > +EFI_STATUS > > +SetBootstrapAccountCredentialsToVariable ( > > + IN CHAR8 *BootstrapUsername, OPTIONAL > > + IN CHAR8 *BootstrapPassword, OPTIONAL > > + IN BOOLEAN DeleteVariable > > + ); > > + > > +#endif > > diff --git > > a/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.inf > > b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCred > > e > > ntialIpmiLib.inf > > new file mode 100644 > > index 0000000000..694e401ad9 > > --- /dev/null > > +++ b/RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatform > > +++ Cr > > +++ edentialIpmiLib.inf > > @@ -0,0 +1,42 @@ > > +## @file > > +# INF file for RedfishPlatformCredentialIpmiLib. > > +# > > +# Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All > > +rights > > reserved. > > +# > > +# SPDX-License-Identifier: BSD-2-Clause-Patent # ## > > + > > +[Defines] > > + INF_VERSION = 0x0001000b > > + BASE_NAME = RedfishPlatformCredentialIpmiLib > > + FILE_GUID = 9C45D622-4C66-417F-814C-F76246D97233 > > + MODULE_TYPE = DXE_DRIVER > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = RedfishPlatformCredentialIpmiLib > > + > > +[Sources] > > + RedfishPlatformCredentialIpmiLib.c > > + RedfishPlatformCredentialIpmiLib.h > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + RedfishPkg/RedfishPkg.dec > > + > > +[LibraryClasses] > > + UefiLib > > + DebugLib > > + IpmiBaseLib > > + MemoryAllocationLib > > + BaseMemoryLib > > + UefiRuntimeServicesTableLib > > + > > +[Pcd] > > + > > > +gEfiRedfishPkgTokenSpaceGuid.PcdRedfishDisableBootstrapCredentialServ > > +i > > c > > +e > > + > > +[Guids] > > + gEfiRedfishVariableGuid > > + > > +[Depex] > > + TRUE > > diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec > > index 53e52c2b00..86102b8ffd 100644 > > --- a/RedfishPkg/RedfishPkg.dec > > +++ b/RedfishPkg/RedfishPkg.dec > > @@ -81,6 +81,9 @@ > > [Guids] > > gEfiRedfishPkgTokenSpaceGuid = { 0x4fdbccb7, 0xe829, 0x4b4c, { 0x88, > > 0x87, 0xb2, 0x3f, 0xd7, 0x25, 0x4b, 0x85 }} > > > > + # Redfish variable guid > > + gEfiRedfishVariableGuid = { 0x85ef8dd3, 0xe606, 0x4b89, { 0x8b, > 0xbd, > > 0x93, 0xbf, 0x5c, 0xbe, 0x1c, 0x18 } } > > + > > [PcdsFixedAtBuild, PcdsPatchableInModule] > > # > > # This PCD is the UEFI device path which is used as the Redfish > > host interface. > > @@ -113,3 +116,7 @@ > > # Default is set to not add. > > # > > > > > gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExAddingExpect|FALSE|BOO > > LEAN|0x00001004 > > + # > > + # This PCD indicates that if BMC bootstrap credential service will > > + be > > disabled by BIOS or not. > > + # > > + > > + > > > gEfiRedfishPkgTokenSpaceGuid.PcdRedfishDisableBootstrapCredentialServi > > + ce|FALSE|BOOLEAN|0x00001005 > > diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc > > index cf25b63cc2..f2ca212bea 100644 > > --- a/RedfishPkg/RedfishPkg.dsc > > +++ b/RedfishPkg/RedfishPkg.dsc > > @@ -3,6 +3,7 @@ > > # > > # Copyright (c) 2019 - 2021, Intel Corporation. All rights > > reserved.<BR> # (C) Copyright 2021 Hewlett-Packard Enterprise > Development LP. > > +# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights > > reserved. > > # > > # SPDX-License-Identifier: BSD-2-Clause-Patent > > # > > @@ -52,6 +53,7 @@ > > [Components] > > > > RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceL > > ibN > > ull.inf > > > > RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull > > .inf > > + > > + > > > RedfishPkg/Library/RedfishPlatformCredentialIpmi/RedfishPlatformCreden > > + tialIpmiLib.inf > Please also add this library to RedfishLibs.dsc.inc. The one in the > [Component] > section should be kept as well so the CI can build it even no module uses it, > if > my understanding of having library in [Component] section is correct. > > Those *.inc under RedfishPkg should be relocated to under \Include later so > the platform can pull it in to the platform dsc. > RedfishPkg.dsc is used to build the individual package. > > > > > > RedfishPkg/Library/RedfishContentCodingLibNull/RedfishContentCodingLib > > Null.inf > > RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf > > RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf > > -- > > 2.39.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100914): https://edk2.groups.io/g/devel/message/100914 Mute This Topic: https://groups.io/mt/97468065/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-