123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- /** @file
- The file operation functions for WiFi Connection Manager.
- Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "WifiConnectionMgrFileUtil.h"
- CHAR16 *mDerPemEncodedSuffix[] = {
- L".cer",
- L".der",
- L".crt",
- L".pem",
- NULL
- };
- /**
- This code checks if the FileSuffix is one of the possible DER/PEM-encoded certificate suffix.
- @param[in] FileSuffix The suffix of the input certificate file
- @retval TRUE It's a DER/PEM-encoded certificate.
- @retval FALSE It's NOT a DER/PEM-encoded certificate.
- **/
- BOOLEAN
- IsDerPemEncodeCertificate (
- IN CONST CHAR16 *FileSuffix
- )
- {
- UINTN Index;
- for (Index = 0; mDerPemEncodedSuffix[Index] != NULL; Index++) {
- if (StrCmp (FileSuffix, mDerPemEncodedSuffix[Index]) == 0) {
- return TRUE;
- }
- }
- return FALSE;
- }
- /**
- Read file content into BufferPtr, the size of the allocate buffer
- is *FileSize plus AddtionAllocateSize.
- @param[in] FileHandle The file to be read.
- @param[in, out] BufferPtr Pointers to the pointer of allocated buffer.
- @param[out] FileSize Size of input file
- @param[in] AddtionAllocateSize Addtion size the buffer need to be allocated.
- In case the buffer need to contain others besides the file content.
- @retval EFI_SUCCESS The file was read into the buffer.
- @retval EFI_INVALID_PARAMETER A parameter was invalid.
- @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
- @retval others Unexpected error.
- **/
- EFI_STATUS
- ReadFileContent (
- IN EFI_FILE_HANDLE FileHandle,
- IN OUT VOID **BufferPtr,
- OUT UINTN *FileSize,
- IN UINTN AddtionAllocateSize
- )
- {
- UINTN BufferSize;
- UINT64 SourceFileSize;
- VOID *Buffer;
- EFI_STATUS Status;
- if ((FileHandle == NULL) || (FileSize == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- Buffer = NULL;
- //
- // Get the file size
- //
- Status = FileHandle->SetPosition (FileHandle, (UINT64)-1);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- Status = FileHandle->GetPosition (FileHandle, &SourceFileSize);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- Status = FileHandle->SetPosition (FileHandle, 0);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- BufferSize = (UINTN)SourceFileSize + AddtionAllocateSize;
- Buffer = AllocateZeroPool (BufferSize);
- if (Buffer == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- BufferSize = (UINTN)SourceFileSize;
- *FileSize = BufferSize;
- Status = FileHandle->Read (FileHandle, &BufferSize, Buffer);
- if (EFI_ERROR (Status) || (BufferSize != *FileSize)) {
- FreePool (Buffer);
- Buffer = NULL;
- Status = EFI_BAD_BUFFER_SIZE;
- goto ON_EXIT;
- }
- ON_EXIT:
- *BufferPtr = Buffer;
- return Status;
- }
- /**
- This function converts an input device structure to a Unicode string.
- @param[in] DevPath A pointer to the device path structure.
- @return A new allocated Unicode string that represents the device path.
- **/
- CHAR16 *
- EFIAPI
- DevicePathToStr (
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath
- )
- {
- return ConvertDevicePathToText (
- DevPath,
- FALSE,
- TRUE
- );
- }
- /**
- Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
- The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL
- means not enough memory resource.
- @param DevicePath Device path.
- @retval NULL Not enough memory resourece for AllocateCopyPool.
- @retval Other A new allocated string that represents the file name.
- **/
- CHAR16 *
- ExtractFileNameFromDevicePath (
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
- )
- {
- CHAR16 *String;
- CHAR16 *MatchString;
- CHAR16 *LastMatch;
- CHAR16 *FileName;
- UINTN Length;
- ASSERT (DevicePath != NULL);
- String = DevicePathToStr (DevicePath);
- if (String == NULL) {
- return NULL;
- }
- MatchString = String;
- LastMatch = String;
- FileName = NULL;
- while (MatchString != NULL) {
- LastMatch = MatchString + 1;
- MatchString = StrStr (LastMatch, L"\\");
- }
- Length = StrLen (LastMatch);
- FileName = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), LastMatch);
- if (FileName != NULL) {
- *(FileName + Length) = 0;
- }
- FreePool (String);
- return FileName;
- }
- /**
- Update the form base on the selected file.
- @param[in] Private The pointer to the global private data structure.
- @param[in] FilePath Point to the file path.
- @param[in] FormId The form needs to display.
- @retval TRUE Exit caller function.
- @retval FALSE Not exit caller function.
- **/
- BOOLEAN
- UpdatePage (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
- IN EFI_FORM_ID FormId
- )
- {
- CHAR16 *FileName;
- EFI_STATUS Status;
- FileName = NULL;
- if (FilePath != NULL) {
- FileName = ExtractFileNameFromDevicePath (FilePath);
- }
- if (FileName == NULL) {
- //
- // FileName = NULL has two cases:
- // 1. FilePath == NULL, not select file.
- // 2. FilePath != NULL, but ExtractFileNameFromDevicePath return NULL not enough memory resource.
- // In these two case, no need to update the form, and exit the caller function.
- //
- return TRUE;
- }
- //
- // Close the previous file handle before open a new one.
- //
- if (Private->FileContext->FHandle != NULL) {
- Private->FileContext->FHandle->Close (Private->FileContext->FHandle);
- }
- Private->FileContext->FHandle = NULL;
- Status = EfiOpenFileByDevicePath (
- &FilePath,
- &Private->FileContext->FHandle,
- EFI_FILE_MODE_READ,
- 0
- );
- if (EFI_ERROR (Status)) {
- if (FormId == FORMID_ENROLL_CERT) {
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME),
- L"",
- NULL
- );
- } else if (FormId == FORMID_ENROLL_PRIVATE_KEY) {
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME),
- L"",
- NULL
- );
- }
- } else {
- if (Private->FileContext->FileName != NULL) {
- FreePool (Private->FileContext->FileName);
- Private->FileContext->FileName = NULL;
- }
- Private->FileContext->FileName = FileName;
- if (FormId == FORMID_ENROLL_CERT) {
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME),
- FileName,
- NULL
- );
- } else if (FormId == FORMID_ENROLL_PRIVATE_KEY) {
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME),
- FileName,
- NULL
- );
- }
- }
- return TRUE;
- }
- /**
- Update the CA form base on the input file path info.
- @param[in] Private The pointer to the global private data structure.
- @param[in] FilePath Point to the file path.
- @retval TRUE Exit caller function.
- @retval FALSE Not exit caller function.
- **/
- BOOLEAN
- UpdateCAFromFile (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath
- )
- {
- return UpdatePage (Private, FilePath, FORMID_ENROLL_CERT);
- }
- /**
- Update the Private Key form base on the input file path info.
- @param[in] Private The pointer to the global private data structure.
- @param[in] FilePath Point to the file path.
- @retval TRUE Exit caller function.
- @retval FALSE Not exit caller function.
- **/
- BOOLEAN
- UpdatePrivateKeyFromFile (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath
- )
- {
- return UpdatePage (Private, FilePath, FORMID_ENROLL_PRIVATE_KEY);
- }
|