mirror of https://github.com/acidanthera/audk.git
94 lines
2.5 KiB
C
94 lines
2.5 KiB
C
/** @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;
|
|
}
|