/** @file
  Provides services to retrieve values from Version 1 of a capsule's FMP Payload
  Header. The FMP Payload Header structure is not defined in the library class.
  Instead, services are provided to retrieve information from the FMP Payload
  Header.  If information is added to the FMP Payload Header, then new services
  may be added to this library class to retrieve the new information.

  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiDxe.h>
#include <Library/FmpPayloadHeaderLib.h>

///
/// Define FMP Payload Header structure here so it is not public
///

#pragma pack(1)

typedef struct {
  UINT32  Signature;
  UINT32  HeaderSize;
  UINT32  FwVersion;
  UINT32  LowestSupportedVersion;
} FMP_PAYLOAD_HEADER;

#pragma pack()

///
/// Identifier is used to make sure the data in the header is for this structure
/// and version.  If the structure changes update the last digit.
///
#define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')

/**
  Returns the FMP Payload Header size in bytes.

  @param[in]  Header          FMP Payload Header to evaluate
  @param[in]  FmpPayloadSize  Size of FMP payload
  @param[out] Size            The size, in bytes, of the FMP Payload Header.

  @retval EFI_SUCCESS            The firmware version was returned.
  @retval EFI_INVALID_PARAMETER  Header is NULL.
  @retval EFI_INVALID_PARAMETER  Size is NULL.
  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload Header.

**/
EFI_STATUS
EFIAPI
GetFmpPayloadHeaderSize (
  IN  CONST VOID   *Header,
  IN  CONST UINTN  FmpPayloadSize,
  OUT UINT32       *Size
  )
{
  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;

  FmpPayloadHeader = NULL;

  if (Header == NULL || Size == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||
      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||
      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
    return EFI_INVALID_PARAMETER;
  }

  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
    return EFI_INVALID_PARAMETER;
  }

  *Size = FmpPayloadHeader->HeaderSize;
  return EFI_SUCCESS;
}

/**
  Returns the version described in the FMP Payload Header.

  @param[in]  Header          FMP Payload Header to evaluate
  @param[in]  FmpPayloadSize  Size of FMP payload
  @param[out] Version         The firmware version described in the FMP Payload
                              Header.

  @retval EFI_SUCCESS            The firmware version was returned.
  @retval EFI_INVALID_PARAMETER  Header is NULL.
  @retval EFI_INVALID_PARAMETER  Version is NULL.
  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload Header.

**/
EFI_STATUS
EFIAPI
GetFmpPayloadHeaderVersion (
  IN  CONST VOID   *Header,
  IN  CONST UINTN  FmpPayloadSize,
  OUT UINT32       *Version
  )
{
  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;

  FmpPayloadHeader = NULL;

  if (Header == NULL || Version == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||
      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||
      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
    return EFI_INVALID_PARAMETER;
  }

  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
    return EFI_INVALID_PARAMETER;
  }

  *Version = FmpPayloadHeader->FwVersion;
  return EFI_SUCCESS;
}

/**
  Returns the lowest supported version described in the FMP Payload Header.

  @param[in]  Header                  FMP Payload Header to evaluate
  @param[in]  FmpPayloadSize          Size of FMP payload
  @param[out] LowestSupportedVersion  The lowest supported version described in
                                      the FMP Payload Header.

  @retval EFI_SUCCESS            The lowest support version was returned.
  @retval EFI_INVALID_PARAMETER  Header is NULL.
  @retval EFI_INVALID_PARAMETER  LowestSupportedVersion is NULL.
  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload Header.

**/
EFI_STATUS
EFIAPI
GetFmpPayloadHeaderLowestSupportedVersion (
  IN  CONST VOID    *Header,
  IN  CONST UINTN   FmpPayloadSize,
  OUT UINT32        *LowestSupportedVersion
  )
{
  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;

  FmpPayloadHeader = NULL;

  if (Header == NULL || LowestSupportedVersion == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) < (UINTN)FmpPayloadHeader ||
      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >= (UINTN)FmpPayloadHeader + FmpPayloadSize ||
      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
    return EFI_INVALID_PARAMETER;
  }

  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
    return EFI_INVALID_PARAMETER;
  }

  *LowestSupportedVersion = FmpPayloadHeader->LowestSupportedVersion;
  return EFI_SUCCESS;
}
