]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigMisc.c
SecurityPkg/SecureBootConfigImpl.c: Secure Boot DBX UI Enhancement
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / SecureBootConfigDxe / SecureBootConfigMisc.c
CommitLineData
ecc722ad 1/** @file\r
2 Helper functions for SecureBoot configuration module.\r
3\r
2a085774 4Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
ecc722ad 5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "SecureBootConfigImpl.h"\r
16\r
17/**\r
18 Read file content into BufferPtr, the size of the allocate buffer \r
19 is *FileSize plus AddtionAllocateSize.\r
20\r
21 @param[in] FileHandle The file to be read.\r
22 @param[in, out] BufferPtr Pointers to the pointer of allocated buffer.\r
23 @param[out] FileSize Size of input file\r
24 @param[in] AddtionAllocateSize Addtion size the buffer need to be allocated. \r
25 In case the buffer need to contain others besides the file content.\r
26 \r
27 @retval EFI_SUCCESS The file was read into the buffer.\r
28 @retval EFI_INVALID_PARAMETER A parameter was invalid.\r
29 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
30 @retval others Unexpected error.\r
31\r
32**/\r
33EFI_STATUS\r
34ReadFileContent (\r
35 IN EFI_FILE_HANDLE FileHandle,\r
36 IN OUT VOID **BufferPtr,\r
37 OUT UINTN *FileSize,\r
38 IN UINTN AddtionAllocateSize\r
39 )\r
40\r
41{\r
42 UINTN BufferSize;\r
43 UINT64 SourceFileSize;\r
44 VOID *Buffer;\r
45 EFI_STATUS Status;\r
46\r
47 if ((FileHandle == NULL) || (FileSize == NULL)) {\r
48 return EFI_INVALID_PARAMETER;\r
49 }\r
50\r
51 Buffer = NULL;\r
52\r
53 //\r
54 // Get the file size\r
55 //\r
56 Status = FileHandle->SetPosition (FileHandle, (UINT64) -1);\r
57 if (EFI_ERROR (Status)) {\r
58 goto ON_EXIT;\r
59 }\r
60\r
61 Status = FileHandle->GetPosition (FileHandle, &SourceFileSize);\r
62 if (EFI_ERROR (Status)) {\r
63 goto ON_EXIT;\r
64 }\r
65 \r
66 Status = FileHandle->SetPosition (FileHandle, 0);\r
67 if (EFI_ERROR (Status)) {\r
68 goto ON_EXIT;\r
69 }\r
70\r
71 BufferSize = (UINTN) SourceFileSize + AddtionAllocateSize;\r
72 Buffer = AllocateZeroPool(BufferSize);\r
73 if (Buffer == NULL) {\r
74 return EFI_OUT_OF_RESOURCES;\r
75 }\r
76\r
77 BufferSize = (UINTN) SourceFileSize;\r
78 *FileSize = BufferSize;\r
79\r
80 Status = FileHandle->Read (FileHandle, &BufferSize, Buffer);\r
81 if (EFI_ERROR (Status) || BufferSize != *FileSize) {\r
82 FreePool (Buffer);\r
83 Buffer = NULL;\r
84 Status = EFI_BAD_BUFFER_SIZE;\r
85 goto ON_EXIT;\r
86 }\r
87\r
88ON_EXIT:\r
89 \r
90 *BufferPtr = Buffer;\r
91 return Status;\r
92}\r
93\r
94/**\r
95 Close an open file handle.\r
96\r
97 @param[in] FileHandle The file handle to close.\r
98 \r
99**/\r
100VOID\r
101CloseFile (\r
102 IN EFI_FILE_HANDLE FileHandle\r
103 )\r
104{\r
105 if (FileHandle != NULL) {\r
106 FileHandle->Close (FileHandle); \r
107 }\r
108}\r
109\r
110/**\r
111 Convert a nonnegative integer to an octet string of a specified length.\r
112\r
113 @param[in] Integer Pointer to the nonnegative integer to be converted\r
114 @param[in] IntSizeInWords Length of integer buffer in words\r
115 @param[out] OctetString Converted octet string of the specified length \r
116 @param[in] OSSizeInBytes Intended length of resulting octet string in bytes\r
117\r
118Returns:\r
119\r
120 @retval EFI_SUCCESS Data conversion successfully\r
121 @retval EFI_BUFFER_TOOL_SMALL Buffer is too small for output string\r
122\r
123**/\r
124EFI_STATUS\r
125EFIAPI\r
126Int2OctStr (\r
127 IN CONST UINTN *Integer,\r
128 IN UINTN IntSizeInWords,\r
129 OUT UINT8 *OctetString,\r
130 IN UINTN OSSizeInBytes\r
131 )\r
132{\r
133 CONST UINT8 *Ptr1;\r
134 UINT8 *Ptr2;\r
135\r
136 for (Ptr1 = (CONST UINT8 *)Integer, Ptr2 = OctetString + OSSizeInBytes - 1;\r
137 Ptr1 < (UINT8 *)(Integer + IntSizeInWords) && Ptr2 >= OctetString;\r
138 Ptr1++, Ptr2--) {\r
139 *Ptr2 = *Ptr1;\r
140 }\r
141 \r
142 for (; Ptr1 < (CONST UINT8 *)(Integer + IntSizeInWords) && *Ptr1 == 0; Ptr1++);\r
143 \r
144 if (Ptr1 < (CONST UINT8 *)(Integer + IntSizeInWords)) {\r
145 return EFI_BUFFER_TOO_SMALL;\r
146 }\r
147 \r
148 if (Ptr2 >= OctetString) {\r
149 ZeroMem (OctetString, Ptr2 - OctetString + 1);\r
150 }\r
151 \r
152 return EFI_SUCCESS;\r
153}\r
154\r
ecc722ad 155/**\r
156 Worker function that prints an EFI_GUID into specified Buffer.\r
157\r
158 @param[in] Guid Pointer to GUID to print.\r
159 @param[in] Buffer Buffer to print Guid into.\r
160 @param[in] BufferSize Size of Buffer.\r
161 \r
162 @retval Number of characters printed.\r
163\r
164**/\r
165UINTN\r
166GuidToString (\r
167 IN EFI_GUID *Guid,\r
168 IN CHAR16 *Buffer,\r
169 IN UINTN BufferSize\r
170 )\r
171{\r
172 UINTN Size;\r
173\r
174 Size = UnicodeSPrint (\r
175 Buffer,\r
176 BufferSize, \r
177 L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
178 (UINTN)Guid->Data1, \r
179 (UINTN)Guid->Data2,\r
180 (UINTN)Guid->Data3,\r
181 (UINTN)Guid->Data4[0],\r
182 (UINTN)Guid->Data4[1],\r
183 (UINTN)Guid->Data4[2],\r
184 (UINTN)Guid->Data4[3],\r
185 (UINTN)Guid->Data4[4],\r
186 (UINTN)Guid->Data4[5],\r
187 (UINTN)Guid->Data4[6],\r
188 (UINTN)Guid->Data4[7]\r
189 );\r
190\r
191 //\r
192 // SPrint will null terminate the string. The -1 skips the null\r
193 //\r
194 return Size - 1;\r
195}\r