]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
SecurityPkg/RngDxe: Documentation/include/parameter cleanup
[mirror_edk2.git] / SecurityPkg / RandomNumberGenerator / RngDxe / RngDxe.c
CommitLineData
b3548d32 1/** @file\r
3aa8dc6c
LQ
2 RNG Driver to produce the UEFI Random Number Generator protocol.\r
3\r
4e5ecdba
RC
4 The driver uses CPU RNG instructions to produce high-quality,\r
5 high-performance entropy and random number.\r
3aa8dc6c 6\r
fc70522f 7 RNG Algorithms defined in UEFI 2.4:\r
4e5ecdba
RC
8 - EFI_RNG_ALGORITHM_SP800_90_CTR_256_GUID\r
9 - EFI_RNG_ALGORITHM_RAW\r
10 - EFI_RNG_ALGORITHM_SP800_90_HMAC_256_GUID\r
11 - EFI_RNG_ALGORITHM_SP800_90_HASH_256_GUID\r
12 - EFI_RNG_ALGORITHM_X9_31_3DES_GUID\r
13 - EFI_RNG_ALGORITHM_X9_31_AES_GUID\r
3aa8dc6c 14\r
b3548d32 15Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
3b60842c 16(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
4e5ecdba 17\r
289b714b 18SPDX-License-Identifier: BSD-2-Clause-Patent\r
3aa8dc6c
LQ
19\r
20**/\r
21\r
4e5ecdba
RC
22#include <Library/BaseLib.h>\r
23#include <Library/BaseMemoryLib.h>\r
24#include <Library/UefiBootServicesTableLib.h>\r
25#include <Library/RngLib.h>\r
4e5ecdba 26#include <Protocol/Rng.h>\r
3aa8dc6c 27\r
4e5ecdba 28#include "RngDxeInternals.h"\r
3aa8dc6c 29\r
3aa8dc6c
LQ
30//\r
31// The Random Number Generator (RNG) protocol\r
32//\r
c411b485 33EFI_RNG_PROTOCOL mRngRdRand = {\r
3aa8dc6c
LQ
34 RngGetInfo,\r
35 RngGetRNG\r
36};\r
37\r
38/**\r
39 The user Entry Point for the Random Number Generator (RNG) driver.\r
40\r
41 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
42 @param[in] SystemTable A pointer to the EFI System Table.\r
43\r
44 @retval EFI_SUCCESS The entry point is executed successfully.\r
45 @retval EFI_NOT_SUPPORTED Platform does not support RNG.\r
46 @retval Other Some error occurs when executing this entry point.\r
47\r
48**/\r
49EFI_STATUS\r
50EFIAPI\r
51RngDriverEntry (\r
c411b485
MK
52 IN EFI_HANDLE ImageHandle,\r
53 IN EFI_SYSTEM_TABLE *SystemTable\r
3aa8dc6c
LQ
54 )\r
55{\r
c411b485
MK
56 EFI_STATUS Status;\r
57 EFI_HANDLE Handle;\r
3aa8dc6c 58\r
3aa8dc6c
LQ
59 //\r
60 // Install UEFI RNG (Random Number Generator) Protocol\r
61 //\r
62 Handle = NULL;\r
63 Status = gBS->InstallMultipleProtocolInterfaces (\r
64 &Handle,\r
65 &gEfiRngProtocolGuid,\r
66 &mRngRdRand,\r
67 NULL\r
68 );\r
3b60842c 69\r
3aa8dc6c
LQ
70 return Status;\r
71}\r
4e5ecdba 72\r
4e5ecdba 73/**\r
199031b2 74 Runs CPU RNG instruction to fill a buffer of arbitrary size with random bytes.\r
4e5ecdba
RC
75\r
76 @param[in] Length Size of the buffer, in bytes, to fill with.\r
77 @param[out] RandBuffer Pointer to the buffer to store the random result.\r
78\r
79 @retval EFI_SUCCESS Random bytes generation succeeded.\r
80 @retval EFI_NOT_READY Failed to request random bytes.\r
81\r
82**/\r
83EFI_STATUS\r
84EFIAPI\r
85RngGetBytes (\r
c411b485
MK
86 IN UINTN Length,\r
87 OUT UINT8 *RandBuffer\r
4e5ecdba
RC
88 )\r
89{\r
c411b485
MK
90 BOOLEAN IsRandom;\r
91 UINT64 TempRand[2];\r
4e5ecdba
RC
92\r
93 while (Length > 0) {\r
94 IsRandom = GetRandomNumber128 (TempRand);\r
95 if (!IsRandom) {\r
96 return EFI_NOT_READY;\r
97 }\r
c411b485 98\r
4e5ecdba 99 if (Length >= sizeof (TempRand)) {\r
c411b485 100 WriteUnaligned64 ((UINT64 *)RandBuffer, TempRand[0]);\r
4e5ecdba 101 RandBuffer += sizeof (UINT64);\r
c411b485 102 WriteUnaligned64 ((UINT64 *)RandBuffer, TempRand[1]);\r
4e5ecdba 103 RandBuffer += sizeof (UINT64);\r
c411b485 104 Length -= sizeof (TempRand);\r
4e5ecdba
RC
105 } else {\r
106 CopyMem (RandBuffer, TempRand, Length);\r
107 Length = 0;\r
108 }\r
109 }\r
110\r
111 return EFI_SUCCESS;\r
112}\r