/** @file
  This file declares Pei Security2 PPI.

  This PPI is installed by some platform PEIM that abstracts the security
  policy to the PEI Foundation, namely the case of a PEIM's authentication
  state being returned during the PEI section extraction process.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This PPI is introduced in PI Version 1.0.

**/

#ifndef __SECURITY2_PPI_H__
#define __SECURITY2_PPI_H__

#define EFI_PEI_SECURITY2_PPI_GUID \
  { 0xdcd0be23, 0x9586, 0x40f4, { 0xb6, 0x43, 0x6, 0x52, 0x2c, 0xed, 0x4e, 0xde } }

typedef struct _EFI_PEI_SECURITY2_PPI EFI_PEI_SECURITY2_PPI;

/**
  Allows the platform builder to implement a security policy
  in response to varying file authentication states.

  This service is published by some platform PEIM. The purpose of
  this service is to expose a given platform's policy-based
  response to the PEI Foundation. For example, if there is a PEIM
  in a GUIDed encapsulation section and the extraction of the PEI
  file section yields an authentication failure, there is no a
  priori policy in the PEI Foundation. Specifically, this
  situation leads to the question whether PEIMs that are either
  not in GUIDed sections or are in sections whose authentication
  fails should still be executed.

  @param PeiServices             An indirect pointer to the PEI Services
                                 Table published by the PEI Foundation.
  @param This                    Interface pointer that implements the
                                 particular EFI_PEI_SECURITY2_PPI instance.
  @param AuthenticationStatus    Authentication status of the file.
                                 xx00 Image was not signed.
                                 xxx1 Platform security policy override.
                                      Assumes same meaning as 0010 (the image was signed, the
                                      signature was tested, and the signature passed authentication test).
                                 0010 Image was signed, the signature was tested,
                                      and the signature passed authentication test.
                                 0110 Image was signed and the signature was not tested.
                                 1010 Image was signed, the signature was tested,
                                      and the signature failed the authentication test.
  @param FvHandle                Handle of the volume in which the file
                                 resides. This allows different policies
                                 depending on different firmware volumes.
  @param FileHandle              Handle of the file under review.
  @param DeferExecution          Pointer to a variable that alerts the
                                 PEI Foundation to defer execution of a
                                 PEIM.

  @retval EFI_SUCCESS            The service performed its action successfully.
  @retval EFI_SECURITY_VIOLATION The object cannot be trusted.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_SECURITY_AUTHENTICATION_STATE)(
  IN CONST  EFI_PEI_SERVICES      **PeiServices,
  IN CONST  EFI_PEI_SECURITY2_PPI *This,
  IN UINT32                       AuthenticationStatus,
  IN EFI_PEI_FV_HANDLE            FvHandle,
  IN EFI_PEI_FILE_HANDLE          FileHandle,
  IN OUT    BOOLEAN               *DeferExecution
  );

///
/// This PPI is a means by which the platform builder can indicate
/// a response to a PEIM's authentication state. This can be in
/// the form of a requirement for the PEI Foundation to skip a
/// module using the DeferExecution Boolean output in the
/// AuthenticationState() member function. Alternately, the
/// Security PPI can invoke something like a cryptographic PPI
/// that hashes the PEIM contents to log attestations, for which
/// the FileHandle parameter in AuthenticationState() will be
/// useful. If this PPI does not exist, PEIMs will be considered
/// trusted.
///
struct _EFI_PEI_SECURITY2_PPI {
  EFI_PEI_SECURITY_AUTHENTICATION_STATE    AuthenticationState;
};

extern EFI_GUID  gEfiPeiSecurity2PpiGuid;

#endif
