/** @file | |
Aarch64 specific code. | |
Copyright (c) 2022, Arm Limited. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/ArmTrngLib.h> | |
#include <Library/RngLib.h> | |
#include <Guid/RngAlgorithm.h> | |
#include "RngDxeInternals.h" | |
// Maximum number of Rng algorithms. | |
#define RNG_AVAILABLE_ALGO_MAX 2 | |
/** Allocate and initialize mAvailableAlgoArray with the available | |
Rng algorithms. Also update mAvailableAlgoArrayCount. | |
@retval EFI_SUCCESS The function completed successfully. | |
@retval EFI_OUT_OF_RESOURCES Could not allocate memory. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
GetAvailableAlgorithms ( | |
VOID | |
) | |
{ | |
EFI_STATUS Status; | |
UINT16 MajorRevision; | |
UINT16 MinorRevision; | |
GUID RngGuid; | |
BOOLEAN UnSafeAlgo; | |
UnSafeAlgo = FALSE; | |
// Rng algorithms 2 times, one for the allocation, one to populate. | |
mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX * sizeof (EFI_RNG_ALGORITHM)); | |
if (mAvailableAlgoArray == NULL) { | |
return EFI_OUT_OF_RESOURCES; | |
} | |
// Identify RngLib algorithm. | |
Status = GetRngGuid (&RngGuid); | |
if (!EFI_ERROR (Status)) { | |
if (IsZeroGuid (&RngGuid) || | |
CompareGuid (&RngGuid, &gEdkiiRngAlgorithmUnSafe)) | |
{ | |
// Treat zero GUID as an unsafe algorithm | |
DEBUG (( | |
DEBUG_WARN, | |
"RngLib uses an Unsafe algorithm and " | |
"must not be used for production builds.\n" | |
)); | |
// Set the UnSafeAlgo flag to indicate an unsafe algorithm was found | |
// so that it can be added at the end of the algorithm list. | |
UnSafeAlgo = TRUE; | |
} else { | |
CopyMem ( | |
&mAvailableAlgoArray[mAvailableAlgoArrayCount], | |
&RngGuid, | |
sizeof (RngGuid) | |
); | |
mAvailableAlgoArrayCount++; | |
} | |
} | |
// Raw algorithm (Trng) | |
if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) { | |
CopyMem ( | |
&mAvailableAlgoArray[mAvailableAlgoArrayCount], | |
&gEfiRngAlgorithmRaw, | |
sizeof (EFI_RNG_ALGORITHM) | |
); | |
mAvailableAlgoArrayCount++; | |
} | |
// Add unsafe algorithm at the end of the list. | |
if (UnSafeAlgo) { | |
CopyMem ( | |
&mAvailableAlgoArray[mAvailableAlgoArrayCount], | |
&gEdkiiRngAlgorithmUnSafe, | |
sizeof (EFI_RNG_ALGORITHM) | |
); | |
mAvailableAlgoArrayCount++; | |
} | |
return EFI_SUCCESS; | |
} |