/** @file
  Implements the GetCryptoServices() API that retuns a pointer to the EDK II
  Crypto PPI.

  Copyright (C) Microsoft Corporation. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/
#include <PiPei.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
#include <Ppi/Crypto.h>

/**
  Internal worker function that returns the pointer to an EDK II Crypto
  Protocol/PPI.  The layout of the PPI, DXE Protocol, and SMM Protocol are
  identical which allows the implementation of the BaseCryptLib functions that
  call through a Protocol/PPI to be shared for the PEI, DXE, and SMM
  implementations.

  This PEI implementation looks up the EDK II Crypto PPI and verifies the
  version each time a crypto service is called, so it is compatible with XIP
  PEIMs.
**/
VOID *
GetCryptoServices (
  VOID
  )
{
  EFI_STATUS        Status;
  EDKII_CRYPTO_PPI  *CryptoPpi;
  UINTN             Version;

  CryptoPpi = NULL;
  Status    = PeiServicesLocatePpi (
                &gEdkiiCryptoPpiGuid,
                0,
                NULL,
                (VOID **)&CryptoPpi
                );
  if (EFI_ERROR (Status) || (CryptoPpi == NULL)) {
    DEBUG ((DEBUG_ERROR, "[PeiCryptLib] Failed to locate Crypto PPI. Status = %r\n", Status));
    ASSERT_EFI_ERROR (Status);
    ASSERT (CryptoPpi != NULL);
    return NULL;
  }

  Version = CryptoPpi->GetVersion ();
  if (Version < EDKII_CRYPTO_VERSION) {
    DEBUG ((DEBUG_ERROR, "[PeiCryptLib] Crypto PPI unsupported version %d\n", Version));
    ASSERT (Version >= EDKII_CRYPTO_VERSION);
    return NULL;
  }

  return (VOID *)CryptoPpi;
}
