MdeModulePkg: Use monotonic count to initialize the NetLib random seed.

NetRandomInitSeed() function use current time to initialize the random seed,
while in some platform the time service is not accuracy that make the random
seed collision. This patch add the monotonic count to the seed to avoid this.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18185 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Fu Siyuan 2015-08-07 03:22:10 +00:00 committed by sfu5
parent f52e226e19
commit 2bd25290f3
2 changed files with 13 additions and 9 deletions

View File

@ -530,13 +530,13 @@ NetPutUint32 (
);
/**
Initialize a random seed using current time.
Initialize a random seed using current time and monotonic count.
Get current time first. Then initialize a random seed based on some basic
mathematical operations on the hour, day, minute, second, nanosecond and year
of the current time.
Get current time and monotonic count first. Then initialize a random seed
based on some basic mathematics operation on the hour, day, minute, second,
nanosecond and year of the current time and the monotonic count value.
@return The random seed, initialized with current time.
@return The random seed initialized with current time.
**/
UINT32

View File

@ -853,11 +853,11 @@ Ip6Swap128 (
}
/**
Initialize a random seed using current time.
Initialize a random seed using current time and monotonic count.
Get current time first. Then initialize a random seed based on some basic
mathematics operation on the hour, day, minute, second, nanosecond and year
of the current time.
Get current time and monotonic count first. Then initialize a random seed
based on some basic mathematics operation on the hour, day, minute, second,
nanosecond and year of the current time and the monotonic count value.
@return The random seed initialized with current time.
@ -870,12 +870,16 @@ NetRandomInitSeed (
{
EFI_TIME Time;
UINT32 Seed;
UINT64 MonotonicCount;
gRT->GetTime (&Time, NULL);
Seed = (~Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second);
Seed ^= Time.Nanosecond;
Seed ^= Time.Year << 7;
gBS->GetNextMonotonicCount (&MonotonicCount);
Seed += (UINT32) MonotonicCount;
return Seed;
}