From: abnchang <abnch...@amd.com> Produce EdkiiHttpsTlsConfigData protocol to provide Redfish REST EX TLS configuration data.
Signed-off-by: Abner Chang <abner.ch...@amd.com> Cc: Saloni Kasbekar <saloni.kasbe...@intel.com> Cc: Zachary Clark-williams <zachary.clark-willi...@intel.com> Cc: Michael Brown <mc...@ipxe.org> Cc: Nickle Wang <nick...@nvidia.com> Cc: Igor Kulchytskyy <ig...@ami.com> --- RedfishPkg/RedfishPkg.dec | 5 ++ .../RedfishRestExDxe/RedfishRestExDxe.inf | 2 + .../RedfishRestExDxe/RedfishRestExDriver.h | 23 +++++- .../RedfishRestExDxe/RedfishRestExDriver.c | 79 ++++++++++++++++++- 4 files changed, 104 insertions(+), 5 deletions(-) diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec index 3ea9ff3ef7f..e4aa8b634c8 100644 --- a/RedfishPkg/RedfishPkg.dec +++ b/RedfishPkg/RedfishPkg.dec @@ -154,3 +154,8 @@ # set to EFI_REST_EX_PROTOCOL. # gEfiRedfishPkgTokenSpaceGuid.PcdRedfishSendReceiveTimeout|5000|UINT32|0x00001009 + # + # This PCD declares whether to provide EDKII_HTTPS_CONFIG_DATA_PROTOCOL + # for Resfish REXT EX HTTPS TLS configuration data. + # + gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExHttpsTlsConfigData|TRUE|BOOLEAN|0x00001010 diff --git a/RedfishPkg/RedfishRestExDxe/RedfishRestExDxe.inf b/RedfishPkg/RedfishRestExDxe/RedfishRestExDxe.inf index 64e6343bfbf..e75f5a87985 100644 --- a/RedfishPkg/RedfishRestExDxe/RedfishRestExDxe.inf +++ b/RedfishPkg/RedfishRestExDxe/RedfishRestExDxe.inf @@ -57,11 +57,13 @@ gEfiHttpServiceBindingProtocolGuid ## TO_START gEfiHttpProtocolGuid ## TO_START gEfiDevicePathProtocolGuid ## TO_START + gEdkiiHttpsTlsConfigDataProtocolGuid ## PRODUCED [Pcd] gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExServiceAccessModeInBand ## CONSUMES gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExChunkRequestMode ## CONSUMES gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExAddingExpect ## CONSUMES + gEfiRedfishPkgTokenSpaceGuid.PcdRedfishRestExHttpsTlsConfigData ## CONSUMES [UserExtensions.TianoCore."ExtraFiles"] RedfishRestExDxeExtra.uni diff --git a/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.h b/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.h index 6b94e5814c4..c3a15f1a976 100644 --- a/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.h +++ b/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.h @@ -30,8 +30,10 @@ /// UEFI Driver Model Protocols /// #include <Protocol/DriverBinding.h> +#include <Protocol/HttpsTlsConfigDataProtocol.h> #include <Protocol/RestEx.h> #include <Protocol/ServiceBinding.h> +#include <Protocol/Tls.h> /// /// Protocol instances @@ -53,13 +55,19 @@ typedef struct _RESTEX_SERVICE RESTEX_SERVICE; /// typedef struct _RESTEX_INSTANCE RESTEX_INSTANCE; +/// +/// RestEx HTTP context +/// +typedef struct _RESTEX_HTTPS_CONTEXT RESTEX_HTTPS_CONTEXT; + /// /// Driver Version /// #define REDFISH_RESTEX_DRIVER_VERSION 0x0100 -#define RESTEX_SERVICE_SIGNATURE SIGNATURE_32 ('R', 'E', 'S', 'S') -#define RESTEX_INSTANCE_SIGNATURE SIGNATURE_32 ('R', 'E', 'I', 'S') +#define RESTEX_SERVICE_SIGNATURE SIGNATURE_32 ('R', 'E', 'S', 'S') +#define RESTEX_INSTANCE_SIGNATURE SIGNATURE_32 ('R', 'E', 'I', 'S') +#define RESTEX_HTTPS_CONTEXT_SIGNATURE SIGNATURE_32 ('R', 'H', 'C', 'S') #define RESTEX_SERVICE_FROM_THIS(a) \ CR (a, RESTEX_SERVICE, ServiceBinding, RESTEX_SERVICE_SIGNATURE) @@ -67,6 +75,9 @@ typedef struct _RESTEX_INSTANCE RESTEX_INSTANCE; #define RESTEX_INSTANCE_FROM_THIS(a) \ CR (a, RESTEX_INSTANCE, RestEx, RESTEX_INSTANCE_SIGNATURE) +#define REDFISH_HTTPS_CONTEXT_FROM_THIS(a) \ + CR (a, RESTEX_HTTPS_CONTEXT, TlsConfigDataProtocol, RESTEX_HTTPS_CONTEXT_SIGNATURE) + #define RESTEX_STATE_UNCONFIGED 0 #define RESTEX_STATE_CONFIGED 1 @@ -93,6 +104,12 @@ struct _RESTEX_SERVICE { #define RESTEX_INSTANCE_FLAGS_TLS_RETRY 0x00000001 #define RESTEX_INSTANCE_FLAGS_TCP_ERROR_RETRY 0x00000002 +struct _RESTEX_HTTPS_CONTEXT { + UINT32 Signature; + EDKII_HTTPS_TLS_CONFIG_DATA_PROTOCOL TlsConfigDataProtocol; + BOOLEAN TlsConfigDataProtocolInstalled; +}; + struct _RESTEX_INSTANCE { UINT32 Signature; LIST_ENTRY Link; @@ -107,6 +124,8 @@ struct _RESTEX_INSTANCE { EFI_REST_EX_CONFIG_DATA ConfigData; + RESTEX_HTTPS_CONTEXT *RestExHttpsContext; + // // HTTP_IO to access the HTTP service // diff --git a/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.c b/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.c index 7036aed4268..f897248fc44 100644 --- a/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.c +++ b/RedfishPkg/RedfishRestExDxe/RedfishRestExDriver.c @@ -76,8 +76,26 @@ RestExDestroyInstance ( IN RESTEX_INSTANCE *Instance ) { - HttpIoDestroyIo (&(Instance->HttpIo)); + EFI_STATUS Status; + if ((Instance != NULL) && + (Instance->RestExHttpsContext != NULL) && + (Instance->RestExHttpsContext->TlsConfigDataProtocolInstalled) + ) + { + Status = gBS->UninstallProtocolInterface ( + Instance->HttpIo.Handle, + &gEdkiiHttpsTlsConfigDataProtocolGuid, + (VOID *)&Instance->RestExHttpsContext->TlsConfigDataProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Fail to uninstall gEdkiiHttpsTlsConfigDataProtocolGuid.\n", __func__)); + } + + FreePool (Instance->RestExHttpsContext); + } + + HttpIoDestroyIo (&(Instance->HttpIo)); FreePool (Instance); } @@ -266,6 +284,56 @@ RestExCreateService ( return Status; } +/** + Initial EDKII_HTTPS_TLS_CONFIG_DATA_PROTOCOL for Redfish REST EX TLS. + + @param[in] Instance REST EX internal structure instance. + +**/ +VOID +RedfishHttpsTlsConfigData ( + IN RESTEX_INSTANCE *Instance + ) +{ + EFI_STATUS Status; + RESTEX_HTTPS_CONTEXT *RestExHttpsContext; + + RestExHttpsContext = AllocateZeroPool (sizeof (RESTEX_HTTPS_CONTEXT)); + if (RestExHttpsContext == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Allocate memory fail for RESTEX_HTTPS_CONTEXT\n", __func__)); + return; + } + + if (Instance->HttpIo.Handle == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid HTTP handle.\n", __func__)); + return; + } + + RestExHttpsContext->Signature = RESTEX_HTTPS_CONTEXT_SIGNATURE; + RestExHttpsContext->TlsConfigDataProtocol.Version.Major = 1; + RestExHttpsContext->TlsConfigDataProtocol.Version.Minor = 0; + RestExHttpsContext->TlsConfigDataProtocol.HttpsTlsConfigData.ConnectionEnd = EfiTlsClient; + RestExHttpsContext->TlsConfigDataProtocol.HttpsTlsConfigData.VerifyMethod = EFI_TLS_VERIFY_NONE; + RestExHttpsContext->TlsConfigDataProtocol.HttpsTlsConfigData.VerifyHost.Flags = EFI_TLS_VERIFY_FLAG_NONE; + RestExHttpsContext->TlsConfigDataProtocol.HttpsTlsConfigData.VerifyHost.HostName = "Redfish Service"; + + // Install EDKII_HTTPS_TLS_CONFIG_DATA_PROTOCOL; + Status = gBS->InstallProtocolInterface ( + &Instance->HttpIo.Handle, + &gEdkiiHttpsTlsConfigDataProtocolGuid, + EFI_NATIVE_INTERFACE, + (VOID *)&RestExHttpsContext->TlsConfigDataProtocol + ); + if (EFI_ERROR (Status)) { + FreePool (RestExHttpsContext); + DEBUG ((DEBUG_ERROR, "%a: Fail to install EDKII_HTTPS_TLS_CONFIG_DATA_PROTOCOL.\n", __func__)); + return; + } + + RestExHttpsContext->TlsConfigDataProtocolInstalled = TRUE; + Instance->RestExHttpsContext = RestExHttpsContext; +} + /** This is the declaration of an EFI image entry point. This entry point is the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including @@ -286,8 +354,6 @@ RedfishRestExDriverEntryPoint ( { EFI_STATUS Status; - Status = EFI_SUCCESS; - // // Install the RestEx Driver Binding Protocol. // @@ -699,6 +765,13 @@ RedfishRestExServiceBindingCreateChild ( goto ON_ERROR; } + // + // Set Redfish HTTPS TLS configuration data. + // + if (FixedPcdGetBool (PcdRedfishRestExHttpsTlsConfigData)) { + RedfishHttpsTlsConfigData (Instance); + } + // // Add it to the parent's child list. // -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#113008): https://edk2.groups.io/g/devel/message/113008 Mute This Topic: https://groups.io/mt/103430433/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-