diff --git a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf index 213813cad9..5be1724f08 100644 --- a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf @@ -35,7 +35,11 @@ Hash/CryptSha256.c Hash/CryptSha512.c Hash/CryptSm3.c - Hash/CryptParallelHashNull.c + Hash/CryptSha3.c + Hash/CryptXkcp.c + Hash/CryptCShake256.c + Hash/CryptParallelHash.c + Hash/CryptDispatchApDxe.c Hmac/CryptHmac.c Kdf/CryptHkdf.c Cipher/CryptAes.c @@ -93,6 +97,11 @@ OpensslLib IntrinsicLib PrintLib + UefiBootServicesTableLib + SynchronizationLib + +[Protocols] + gEfiMpServiceProtocolGuid # # Remove these [BuildOptions] after this library is cleaned up diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApDxe.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApDxe.c new file mode 100644 index 0000000000..607aa7cd48 --- /dev/null +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApDxe.c @@ -0,0 +1,49 @@ +/** @file + Dispatch Block to Aps in Dxe phase for parallelhash algorithm. + +Copyright (c) 2022, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "CryptParallelHash.h" +#include +#include + +/** + Dispatch the block task to each AP in PEI phase. + +**/ +VOID +EFIAPI +DispatchBlockToAp ( + VOID + ) +{ + EFI_STATUS Status; + EFI_MP_SERVICES_PROTOCOL *MpServices; + + Status = gBS->LocateProtocol ( + &gEfiMpServiceProtocolGuid, + NULL, + (VOID **)&MpServices + ); + if (EFI_ERROR (Status)) { + // + // Failed to locate MpServices Protocol, do parallel hash by one core. + // + DEBUG ((DEBUG_ERROR, "[DispatchBlockToApDxe] Failed to locate MpServices Protocol. Status = %r\n", Status)); + return; + } + + Status = MpServices->StartupAllAPs ( + MpServices, + ParallelHashApExecute, + FALSE, + NULL, + 0, + NULL, + NULL + ); + return; +} diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApMm.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApMm.c new file mode 100644 index 0000000000..0237fb38bc --- /dev/null +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApMm.c @@ -0,0 +1,35 @@ +/** @file + Dispatch the block task to each AP in Smm mode for parallelhash algorithm. + +Copyright (c) 2022, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "CryptParallelHash.h" +#include + +/** + Dispatch the block task to each AP in SMM mode. + +**/ +VOID +EFIAPI +DispatchBlockToAp ( + VOID + ) +{ + UINTN Index; + + if (gMmst == NULL) { + return; + } + + for (Index = 0; Index < gMmst->NumberOfCpus; Index++) { + if (Index != gMmst->CurrentlyExecutingCpu) { + gMmst->MmStartupThisAp (ParallelHashApExecute, Index, NULL); + } + } + + return; +} diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApPei.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApPei.c new file mode 100644 index 0000000000..9ddd23d320 --- /dev/null +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptDispatchApPei.c @@ -0,0 +1,54 @@ +/** @file + Dispatch Block to Aps in Pei phase for parallelhash algorithm. + +Copyright (c) 2022, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "CryptParallelHash.h" +#include +#include +#include +#include + +/** + Dispatch the block task to each AP in PEI phase. + +**/ +VOID +EFIAPI +DispatchBlockToAp ( + VOID + ) +{ + EFI_STATUS Status; + CONST EFI_PEI_SERVICES **PeiServices; + EFI_PEI_MP_SERVICES_PPI *MpServicesPpi; + + PeiServices = GetPeiServicesTablePointer (); + Status = (*PeiServices)->LocatePpi ( + PeiServices, + &gEfiPeiMpServicesPpiGuid, + 0, + NULL, + (VOID **)&MpServicesPpi + ); + if (EFI_ERROR (Status)) { + // + // Failed to locate MpServices Ppi, do parallel hash by one core. + // + DEBUG ((DEBUG_ERROR, "[DispatchBlockToApPei] Failed to locate MpServices Ppi. Status = %r\n", Status)); + return; + } + + Status = MpServicesPpi->StartupAllAPs ( + (CONST EFI_PEI_SERVICES **)PeiServices, + MpServicesPpi, + ParallelHashApExecute, + FALSE, + 0, + NULL + ); + return; +} diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.c b/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.c index f7ce9dbf52..2931123736 100644 --- a/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.c +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.c @@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "CryptParallelHash.h" -#include #include #define PARALLELHASH_CUSTOMIZATION "ParallelHash" @@ -69,27 +68,6 @@ ParallelHashApExecute ( } } -/** - Dispatch the block task to each AP in SMM mode. - -**/ -VOID -EFIAPI -MmDispatchBlockToAP ( - VOID - ) -{ - UINTN Index; - - for (Index = 0; Index < gMmst->NumberOfCpus; Index++) { - if (Index != gMmst->CurrentlyExecutingCpu) { - gMmst->MmStartupThisAp (ParallelHashApExecute, Index, NULL); - } - } - - return; -} - /** Parallel hash function ParallelHash256, as defined in NIST's Special Publication 800-185, published December 2016. @@ -197,9 +175,7 @@ ParallelHash256HashAll ( // // Dispatch blocklist to each AP. // - if (gMmst != NULL) { - MmDispatchBlockToAP (); - } + DispatchBlockToAp (); // // Wait until all block hash completed. diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.h b/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.h index dcfe200e58..03a1a58cb8 100644 --- a/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.h +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptParallelHash.h @@ -201,3 +201,26 @@ CShake256HashAll ( IN UINTN CustomizationLen, OUT UINT8 *HashValue ); + +/** + Complete computation of digest of each block. + + Each AP perform the function called by BSP. + + @param[in] ProcedureArgument Argument of the procedure. +**/ +VOID +EFIAPI +ParallelHashApExecute ( + IN VOID *ProcedureArgument + ); + +/** + Dispatch the block task to each AP. + +**/ +VOID +EFIAPI +DispatchBlockToAp ( + VOID + ); diff --git a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf index b1629647f9..2aafa5f0ac 100644 --- a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf @@ -40,7 +40,11 @@ Hash/CryptSha256.c Hash/CryptSm3.c Hash/CryptSha512.c - Hash/CryptParallelHashNull.c + Hash/CryptSha3.c + Hash/CryptXkcp.c + Hash/CryptCShake256.c + Hash/CryptParallelHash.c + Hash/CryptDispatchApPei.c Hmac/CryptHmac.c Kdf/CryptHkdf.c Cipher/CryptAesNull.c @@ -80,7 +84,12 @@ OpensslLib IntrinsicLib PrintLib + PeiServicesTablePointerLib + PeiServicesLib + SynchronizationLib +[Ppis] + gEfiPeiMpServicesPpiGuid # # Remove these [BuildOptions] after this library is cleaned up # diff --git a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf index 0af7a3f96e..00ea7bf4c5 100644 --- a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf +++ b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf @@ -42,6 +42,7 @@ Hash/CryptXkcp.c Hash/CryptCShake256.c Hash/CryptParallelHash.c + Hash/CryptDispatchApMm.c Hmac/CryptHmac.c Kdf/CryptHkdfNull.c Cipher/CryptAes.c