blob: fe335f83df4acc5450522e04a5621fa0b001ce2f [file] [log] [blame]
/** @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;
}