CryptoPkg/Library: Add BaseCryptLibOnProtocolPpi instances

https://bugzilla.tianocore.org/show_bug.cgi?id=2420

Based on the following package with changes to merge into
CryptoPkg.

https://github.com/microsoft/mu_plus/tree/dev/201908/SharedCryptoPkg

Add the PeiCryptLib, DxeCryptLib, and SmmCryptLib instances
of the BaseCryptLib library classes that are implemented using
the services of EDK II Crypto Protocols/PPIs.

These library instances all set a dependency expression on the
EDK II Crypto Protocols/PPIs, so any modules that use these
library instances are not dispatched until the modules that
produce the EDK II Crypto Protocols/PPIs are dispatched.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
This commit is contained in:
Michael D Kinney
2019-11-21 09:24:53 -08:00
committed by mergify[bot]
parent cc1d13c922
commit cd70de1cc0
8 changed files with 4741 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
/** @file
Implements the GetCryptoServices() API that retuns a pointer to the EDK II
Crypto Protocol.
Copyright (C) Microsoft Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/Crypto.h>
EDKII_CRYPTO_PROTOCOL *mCryptoProtocol = NULL;
/**
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 DXE implementation returns the pointer to the EDK II Crypto Protocol
that was found in the library constructor DxeCryptLibConstructor().
**/
VOID *
GetCryptoServices (
VOID
)
{
return (VOID *)mCryptoProtocol;
}
EFI_STATUS
EFIAPI
DxeCryptLibConstructor (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
UINTN Version;
Status = gBS->LocateProtocol (
&gEdkiiCryptoProtocolGuid,
NULL,
(VOID **)&mCryptoProtocol
);
if (EFI_ERROR (Status) || mCryptoProtocol == NULL) {
DEBUG((DEBUG_ERROR, "[DxeCryptLib] Failed to locate Crypto Protocol. Status = %r\n", Status));
ASSERT_EFI_ERROR (Status);
ASSERT (mCryptoProtocol != NULL);
mCryptoProtocol = NULL;
return EFI_NOT_FOUND;
}
Version = mCryptoProtocol->GetVersion ();
if (Version < EDKII_CRYPTO_VERSION) {
DEBUG((DEBUG_ERROR, "[DxeCryptLib] Crypto Protocol unsupported version %d\n", Version));
ASSERT (Version >= EDKII_CRYPTO_VERSION);
mCryptoProtocol = NULL;
return EFI_NOT_FOUND;
}
return EFI_SUCCESS;
}