mirror of https://github.com/acidanthera/audk.git
115 lines
2.8 KiB
C
115 lines
2.8 KiB
C
/** @file
|
|
Pseudorandom Number Generator Wrapper Implementation over MbedTLS.
|
|
|
|
Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include "InternalCryptLib.h"
|
|
#include <Library/RngLib.h>
|
|
|
|
/**
|
|
Sets up the seed value for the pseudorandom number generator.
|
|
|
|
This function sets up the seed value for the pseudorandom number generator.
|
|
If Seed is not NULL, then the seed passed in is used.
|
|
If Seed is NULL, then default seed is used.
|
|
|
|
@param[in] Seed Pointer to seed value.
|
|
If NULL, default seed is used.
|
|
@param[in] SeedSize Size of seed value.
|
|
If Seed is NULL, this parameter is ignored.
|
|
|
|
@retval TRUE Pseudorandom number generator has enough entropy for random generation.
|
|
@retval FALSE Pseudorandom number generator does not have enough entropy for random generation.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
RandomSeed (
|
|
IN CONST UINT8 *Seed OPTIONAL,
|
|
IN UINTN SeedSize
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
/**
|
|
Generates a pseudorandom byte stream of the specified size.
|
|
|
|
If Output is NULL, then return FALSE.
|
|
|
|
@param[out] Output Pointer to buffer to receive random value.
|
|
@param[in] Size Size of random bytes to generate.
|
|
|
|
@retval TRUE Pseudorandom byte stream generated successfully.
|
|
@retval FALSE Pseudorandom number generator fails to generate due to lack of entropy.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
RandomBytes (
|
|
OUT UINT8 *Output,
|
|
IN UINTN Size
|
|
)
|
|
{
|
|
BOOLEAN Ret;
|
|
volatile UINT64 TempRand;
|
|
|
|
//
|
|
// Check input parameters.
|
|
//
|
|
if ((Output == NULL) || (Size > INT_MAX)) {
|
|
return FALSE;
|
|
}
|
|
|
|
Ret = FALSE;
|
|
|
|
while (Size > 0) {
|
|
// Use RngLib to get random number
|
|
Ret = GetRandomNumber64 ((UINT64 *)&TempRand);
|
|
|
|
if (!Ret) {
|
|
TempRand = 0;
|
|
return Ret;
|
|
}
|
|
|
|
if (Size >= sizeof (TempRand)) {
|
|
*((UINT64 *)Output) = TempRand;
|
|
Output += sizeof (UINT64);
|
|
Size -= sizeof (TempRand);
|
|
} else {
|
|
CopyMem (Output, (VOID *)&TempRand, Size);
|
|
Size = 0;
|
|
}
|
|
}
|
|
|
|
TempRand = 0;
|
|
return Ret;
|
|
}
|
|
|
|
/**
|
|
The MbedTLS function f_rng, which MbedtlsRand implements.
|
|
|
|
@param[in] RngState Not used, just for compatibility with mbedtls.
|
|
@param[out] Output Pointer to buffer to receive random value.
|
|
@param[in] Len Size of random bytes to generate.
|
|
|
|
@retval 0 Pseudorandom byte stream generated successfully.
|
|
@retval Non-0 Pseudorandom number generator fails to generate due to lack of entropy.
|
|
**/
|
|
INT32
|
|
MbedtlsRand (
|
|
VOID *RngState,
|
|
UINT8 *Output,
|
|
UINTN Len
|
|
)
|
|
{
|
|
BOOLEAN Result;
|
|
|
|
Result = RandomBytes (Output, Len);
|
|
|
|
return Result ? 0 : -1;
|
|
}
|