]>
Commit | Line | Data |
---|---|---|
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 | 15 | Copyright (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 | 18 | SPDX-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 | 33 | EFI_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 | |
49 | EFI_STATUS\r | |
50 | EFIAPI\r | |
51 | RngDriverEntry (\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 | |
83 | EFI_STATUS\r | |
84 | EFIAPI\r | |
85 | RngGetBytes (\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 |