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 Seed is NULL, then default seed is used.
|
||||||
If this interface is not supported, then return FALSE.
|
If this interface is not supported, then return FALSE.
|
||||||
|
|
||||||
|
RandomSeed has not been implemented in BaseCryptoLibMbedTls.
|
||||||
|
|
||||||
@param[in] Seed Pointer to seed value.
|
@param[in] Seed Pointer to seed value.
|
||||||
If NULL, default seed is used.
|
If NULL, default seed is used.
|
||||||
@param[in] SeedSize Size of seed value.
|
@param[in] SeedSize Size of seed value.
|
||||||
|
|
|
@ -22,4 +22,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
//
|
//
|
||||||
#include <mbedtls/mbedtls_config.h>
|
#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
|
#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