/** @file Aarch64 specific code. Copyright (c) 2022, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #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; }