10#define ENROLL_CERT L"enroll-cert"
11#define DELETE_CERT L"delete-cert"
12#define DELETE_ALL_CERTS L"delete-all-certs"
38 if (Entry->Id != NULL) {
39 FreePool ((CHAR8 *)Entry->Id);
42 if (Entry->Name != NULL) {
43 FreePool ((CHAR8 *)Entry->Name);
46 if (Entry->Path != NULL) {
47 FreePool ((CHAR8 *)Entry->Path);
50 if (Entry->Arguments != NULL) {
51 FreePool ((CHAR8 *)Entry->Arguments);
54 if (Entry->UnmanagedDevicePath != NULL) {
55 FreePool (Entry->UnmanagedDevicePath);
71 if ((Entries == NULL) || (*Entries == NULL)) {
75 for (Index = 0; Index < NumEntries; Index++) {
96 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
97 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
100 Status =
gBS->HandleProtocol (
105 if (EFI_ERROR (Status)) {
108 "NETB: Missing device path - %r\n",
115 if (PickerEntry == NULL) {
116 return EFI_OUT_OF_RESOURCES;
119 IdLen = StrLen (Description);
120 PickerEntry->
Id = AllocatePool ((IdLen + 1) *
sizeof (PickerEntry->
Id[0]));
121 if (PickerEntry->
Id == NULL) {
122 return EFI_OUT_OF_RESOURCES;
125 UnicodeStrToAsciiStrS (Description, (CHAR8 *)PickerEntry->
Id, IdLen + 1);
127 PickerEntry->
Name = AllocateCopyPool (IdLen + 1, PickerEntry->
Id);
128 if (PickerEntry->
Name == NULL) {
129 return EFI_OUT_OF_RESOURCES;
132 if (IsHttpBoot && (HttpBootUri != NULL)) {
134 if (EFI_ERROR (Status)) {
138 NewDevicePath = DuplicateDevicePath (DevicePath);
139 if (NewDevicePath == NULL) {
140 return EFI_OUT_OF_RESOURCES;
166 IN CONST EFI_HANDLE Device OPTIONAL,
168 OUT UINTN *NumEntries
173 EFI_HANDLE *HandleBuffer;
175 CHAR16 *NetworkDescription;
184 if (Device != NULL) {
185 return EFI_NOT_FOUND;
188 Status =
gBS->LocateHandleBuffer (
190 &gEfiLoadFileProtocolGuid,
196 if (EFI_ERROR (Status)) {
197 DEBUG ((DEBUG_INFO,
"NETB: Load file protocol - %r\n", Status));
202 if (FlexPickerEntries == NULL) {
203 return EFI_OUT_OF_RESOURCES;
206 for (Index = 0; Index < HandleCount; ++Index) {
208 if (NetworkDescription == NULL) {
215 if ((IdStr = StrStr (NetworkDescription,
PxeBootId)) != NULL) {
219 }
else if ((IdStr = StrStr (NetworkDescription,
HttpBootId)) != NULL) {
230 DEBUG ((DEBUG_INFO,
"NETB: Adding %s\n", NetworkDescription));
240 DEBUG ((DEBUG_INFO,
"NETB: Ignoring %s\n", NetworkDescription));
243 FreePool (NetworkDescription);
246 if (EFI_ERROR (Status)) {
251 FreePool (HandleBuffer);
253 if (EFI_ERROR (Status)) {
260 if (*NumEntries == 0) {
261 return EFI_NOT_FOUND;
281 BOOLEAN DeleteAllCerts;
285 Status = EFI_SUCCESS;
290 for (Index = 0; Index < ParsedLoadOptions->
Count; ++Index) {
295 DeleteAllCerts = FALSE;
304 DeleteAllCerts = TRUE;
308 if ( (EnrollCert || DeleteCert || DeleteAllCerts)
315 DeleteAllCerts = FALSE;
318 if ((EnrollCert || DeleteCert) && (Option->
Unicode.
Value == NULL)) {
319 DEBUG ((DEBUG_INFO,
"NETB: Ignoring %s option with no cert value\n", Option->
Unicode.
Name));
324 if (EnrollCert || DeleteCert || DeleteAllCerts) {
325 OwnerGuid = AllocateZeroPool (
sizeof (EFI_GUID));
326 if (OwnerGuid == NULL) {
327 Status = EFI_OUT_OF_RESOURCES;
335 Status = StrToGuid (&Option->
Unicode.
Name[OptionLen + 1], OwnerGuid);
336 if (EFI_ERROR (Status)) {
337 DEBUG ((DEBUG_WARN,
"NETB: Cannot parse cert owner GUID from %s - %r\n", Option->
Unicode.
Name, Status));
342 if (DeleteAllCerts) {
344 EFI_TLS_CA_CERTIFICATE_VARIABLE,
345 &gEfiTlsCaCertificateGuid,
351 DEBUG ((DEBUG_INFO,
"NETB: %s %u deleted - %r\n", Option->
Unicode.
Name, DeletedCount, Status));
359 CertData = AllocateZeroPool (CertSize + 1);
360 if (CertData == NULL) {
361 Status = EFI_OUT_OF_RESOURCES;
365 UnicodeStrToAsciiStrS (Option->
Unicode.
Value, CertData, CertSize + 1);
369 EFI_TLS_CA_CERTIFICATE_VARIABLE,
370 &gEfiTlsCaCertificateGuid,
376 DEBUG ((DEBUG_INFO,
"NETB: %s %u deleted - %r\n", Option->
Unicode.
Name, DeletedCount, Status));
379 EFI_TLS_CA_CERTIFICATE_VARIABLE,
380 &gEfiTlsCaCertificateGuid,
385 if (EFI_ERROR (Status)) {
386 if (Status == EFI_ALREADY_STARTED) {
387 DEBUG ((DEBUG_INFO,
"NETB: %s already present\n", Option->
Unicode.
Name));
388 Status = EFI_SUCCESS;
390 DEBUG ((DEBUG_INFO,
"NETB: Error checking for cert presence - %r\n", Status));
394 EFI_TLS_CA_CERTIFICATE_VARIABLE,
395 &gEfiTlsCaCertificateGuid,
400 DEBUG ((DEBUG_INFO,
"NETB: %s - %r\n", Option->
Unicode.
Name, Status));
407 FreePool (OwnerGuid);
409 if (EFI_ERROR (Status)) {
430 IN EFI_HANDLE ImageHandle,
431 IN EFI_SYSTEM_TABLE *SystemTable
435 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
439 Status =
gBS->HandleProtocol (
442 (VOID **)&LoadedImage
444 if (EFI_ERROR (Status)) {
456 if (EFI_ERROR (Status)) {
457 if (Status != EFI_NOT_FOUND) {
461 Status = EFI_SUCCESS;
475 if (TempUri != NULL) {
476 mHttpBootUri = AllocateCopyPool (StrSize (TempUri), TempUri);
478 Status = EFI_OUT_OF_RESOURCES;
482 if (!EFI_ERROR (Status)) {
484 if (EFI_ERROR (Status)) {
485 DEBUG ((DEBUG_WARN,
"NETB: Failed to enroll certs - %r\n", Status));
493 if (!EFI_ERROR (Status)) {
495 if (EFI_ERROR (Status)) {
496 DEBUG ((DEBUG_WARN,
"NETB: Failed to update static IPs - %r\n", Status));
501 if (!EFI_ERROR (Status)) {
518 DEBUG ((DEBUG_INFO,
"NETB: URI specified but HTTP boot is disabled\n"));
521 DEBUG ((DEBUG_WARN,
"NETB: Invalid URI https:// is required\n"));
527 Status =
gBS->InstallMultipleProtocolInterfaces (
535 if (ParsedLoadOptions != NULL) {
CHAR16 * BmGetNetworkDescription(IN EFI_HANDLE Handle)
EFI_STATUS EFIAPI PxeBootCustomRead(IN OC_STORAGE_CONTEXT *Storage, IN OC_BOOT_ENTRY *ChosenEntry, OUT VOID **Data, OUT UINT32 *DataSize, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN OC_DMG_LOADING_SUPPORT DmgLoading, OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext, OUT VOID **Context)
EFI_STATUS EFIAPI HttpBootCustomRead(IN OC_STORAGE_CONTEXT *Storage, IN OC_BOOT_ENTRY *ChosenEntry, OUT VOID **Data, OUT UINT32 *DataSize, OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_HANDLE *StorageHandle, OUT EFI_DEVICE_PATH_PROTOCOL **StoragePath, IN OC_DMG_LOADING_SUPPORT DmgLoading, OUT OC_APPLE_DISK_IMAGE_PRELOAD_CONTEXT *DmgPreloadContext, OUT VOID **Context)
EFI_STATUS EFIAPI HttpBootCustomFree(IN VOID *Context)
EFI_STATUS LogInstalledCerts(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid)
EFI_STATUS AddRemoveStaticIPs(OC_FLEX_ARRAY *ParsedLoadOptions)
EFI_STATUS EnrollX509toVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data)
EFI_STATUS DeleteCertsForOwner(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data, OUT UINTN *DeletedCount)
EFI_STATUS HttpBootAddUri(EFI_DEVICE_PATH_PROTOCOL *DevicePath, VOID *Uri, OC_STRING_FORMAT StringFormat, EFI_DEVICE_PATH_PROTOCOL **UriDevicePath)
EFI_STATUS CertIsPresent(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN EFI_GUID *OwnerGuid, IN UINTN X509DataSize, IN VOID *X509Data)
BOOLEAN HasHttpsUri(CHAR16 *Uri)
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
#define OC_FLAVOUR_HTTP_BOOT6
BOOLEAN OcHasParsedVar(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, IN CONST OC_STRING_FORMAT StringFormat)
BOOLEAN OcParsedVarsGetUnicodeStr(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST CHAR16 *Name, OUT CHAR16 **StrValue)
#define OC_FLAVOUR_PXE_BOOT6
#define OC_FLAVOUR_HTTP_BOOT4
#define OC_FLAVOUR_PXE_BOOT4
VOID DebugPrintDevicePathForHandle(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_HANDLE Handle OPTIONAL)
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
OC_FLEX_ARRAY * OcFlexArrayInit(IN CONST UINTN ItemSize, IN CONST OC_FLEX_ARRAY_FREE_ITEM FreeItem OPTIONAL)
VOID(* OC_FLEX_ARRAY_FREE_ITEM)(IN VOID *Item)
VOID OcFlexArrayFreeContainer(IN OUT OC_FLEX_ARRAY **FlexArray, IN OUT VOID **Items, IN OUT UINTN *Count)
VOID * OcFlexArrayAddItem(IN OUT OC_FLEX_ARRAY *FlexArray)
VOID * OcFlexArrayItemAt(IN CONST OC_FLEX_ARRAY *FlexArray, IN CONST UINTN Index)
#define L_STR_LEN(String)
BOOLEAN EFIAPI OcUnicodeStartsWith(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
APPLE_EVENT_HANDLE Handle
STATIC BOOLEAN mAllowIpv4
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_STATUS EnrollCerts(OC_FLEX_ARRAY *ParsedLoadOptions)
STATIC VOID InternalFreePickerEntry(IN OC_PICKER_ENTRY *Entry)
STATIC OC_BOOT_ENTRY_PROTOCOL mNetworkBootEntryProtocol
STATIC CHAR16 * mHttpBootUri
STATIC CHAR16 HttpBootId[]
STATIC BOOLEAN mAllowIpv6
STATIC VOID EFIAPI FreeNetworkBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
STATIC BOOLEAN mAllowPxeBoot
STATIC BOOLEAN mAllowHttpBoot
STATIC EFI_STATUS InternalAddEntry(OC_FLEX_ARRAY *FlexPickerEntries, CHAR16 *Description, EFI_HANDLE Handle, CHAR16 *HttpBootUri, BOOLEAN IsIPv4, BOOLEAN IsHttpBoot)
STATIC EFI_STATUS EFIAPI GetNetworkBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
STATIC CHAR16 PxeBootId[]
STATIC BOOLEAN mAuxEntries
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
OC_CUSTOM_READ CustomRead
EFI_DEVICE_PATH_PROTOCOL * UnmanagedDevicePath
OC_CUSTOM_FREE CustomFree
OC_PARSED_VAR_UNICODE Unicode