mirror of https://github.com/acidanthera/audk.git
CryptoPkg: Add rand function for BaseCryptLibMbedTls
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4177 Add rand function for BaseCryptLibMbedTls. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Yi Li <yi1.li@intel.com> Signed-off-by: Wenxing Hou <wenxing.hou@intel.com> Reviewed-by: Yi Li <yi1.li@intel.com> Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
This commit is contained in:
parent
1d8fedb0cd
commit
8deeda7ce0
|
@ -3139,6 +3139,8 @@ DhComputeKey (
|
|||
If Seed is NULL, then default seed is used.
|
||||
If this interface is not supported, then return FALSE.
|
||||
|
||||
RandomSeed has not been implemented in BaseCryptoLibMbedTls.
|
||||
|
||||
@param[in] Seed Pointer to seed value.
|
||||
If NULL, default seed is used.
|
||||
@param[in] SeedSize Size of seed value.
|
||||
|
|
|
@ -22,4 +22,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||
//
|
||||
#include <mbedtls/mbedtls_config.h>
|
||||
|
||||
/**
|
||||
The MbedTLS function f_rng, which MbedtlsRand implements.
|
||||
|
||||
@param[in] RngState Not used, just for compatibility with mbedlts.
|
||||
@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
|
||||
);
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
/** @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 mbedlts.
|
||||
@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;
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
/** @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 mbedlts.
|
||||
@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;
|
||||
}
|
Loading…
Reference in New Issue