17#include <Library/DebugLib.h>
18#include <Library/BaseLib.h>
19#include <Library/BaseMemoryLib.h>
20#include <Library/MemoryAllocationLib.h>
21#include <Library/UefiBootServicesTableLib.h>
22#include <Library/UefiRuntimeServicesTableLib.h>
23#include <Library/UefiLib.h>
76 DEBUG ((DEBUG_INFO,
"OCSMC: SmcReadValue Key %X Size %d\n", Key,
Size));
109 DEBUG ((DEBUG_INFO,
"OCSMC: SmcWriteValue Key %X Size %d\n", Key,
Size));
111 if (!Value || (
Size == 0)) {
123 DEBUG ((DEBUG_INFO,
"OCSMC: Not updating key with non-zero data\n"));
144 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcMakeKey\n"));
146 if ((Name != NULL) && (Key != NULL)) {
159 }
while (Index <
sizeof (*Key) /
sizeof (*Name));
177 "OCSMC: SmcIoVirtualSmcGetKeyCount %u\n",
199 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcGetKeyFromIndex\n"));
226 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcGetKeyFromIndex %X\n", Key));
228 if ((
Size == NULL) || (Type == NULL) || (Attributes == NULL)) {
252 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcReset %X\n", Mode));
265 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcFlashType %X\n", Type));
277 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnsupported\n"));
292 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcFlashWrite %d\n",
Size));
306 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcFlashAuth %d\n",
Size));
318 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnknown1\n"));
332 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnknown2\n"));
346 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnknown3\n"));
359 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnknown4\n"));
372 DEBUG ((DEBUG_VERBOSE,
"OCSMC: SmcIoVirtualSmcUnknown5\n"));
421 CONST UINT8 *InitVector;
427 DEBUG ((DEBUG_INFO,
"OCSMC: Invalid key length - %u\n", (UINT32)
Size));
441 DEBUG ((DEBUG_INFO,
"OCSMC: Invalid encrypted key length - %u\n", (UINT32)
Size));
448 for (Index = 0; Index <
sizeof (EncryptKey); Index++) {
449 EncryptKey[Index] =
OcRtcRead (0xD0 + Index);
456 InitVector =
Buffer +
sizeof (UINT32);
463 RealSize = *(
const UINT32 *)Payload;
469 DEBUG ((DEBUG_INFO,
"OCSMC: Invalid decrypted key length - %d\n", RealSize));
478 DEBUG ((DEBUG_INFO,
"OCSMC: Invalid key magic - %02X %02X %02X %02X\n",
Buffer[0],
Buffer[1],
Buffer[2],
Buffer[3]));
493 UINT32 Attributes = 0;
500 if (Status == EFI_BUFFER_TOO_SMALL) {
504 if (EFI_ERROR (Status)) {
505 DEBUG ((DEBUG_INFO,
"OCSMC: Layer key (%u, %X) obtain failure - %r\n", (UINT32)
Size, Attributes, Status));
508 DEBUG ((DEBUG_INFO,
"OCSMC: Key buffer (%u) allocation failure - %r\n", (UINT32)
Size, Status));
509 Status = EFI_OUT_OF_RESOURCES;
512 DEBUG ((DEBUG_INFO,
"OCSMC: Initial key obtain failure - %r\n", Status));
522 if (!EFI_ERROR (Status)) {
528 if (EFI_ERROR (Status)) {
529 DEBUG ((DEBUG_INFO,
"OCSMC: Failed to zero key - %r\n", Status));
539 if (EFI_ERROR (Status)) {
540 DEBUG ((DEBUG_INFO,
"OCSMC: Failed to remove key - %r\n", Status));
546 Status =
gBS->CreateEvent (
547 EVT_SIGNAL_EXIT_BOOT_SERVICES,
553 if (EFI_ERROR (Status)) {
554 DEBUG ((DEBUG_INFO,
"OCSMC: Failed to create exit bs event for hbkp erase\n"));
565 UINT32 StatusBuffer[2];
566 UINT8 *StatusBufferMagic;
568 StatusBufferMagic = (UINT8 *)&StatusBuffer[0];
573 StatusBufferMagic[0] =
'V';
574 StatusBufferMagic[1] =
'S';
575 StatusBufferMagic[2] =
'M';
576 StatusBufferMagic[3] =
'C';
584 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
585 sizeof (StatusBuffer),
589 if (EFI_ERROR (Status)) {
590 DEBUG ((DEBUG_INFO,
"OCSMC: Failed to create status - %r\n", Status));
596 IN BOOLEAN Reinstall,
597 IN BOOLEAN AuthRestart
602 EFI_HANDLE NewHandle;
611 if (EFI_ERROR (Status)) {
612 DEBUG ((DEBUG_ERROR,
"OCSMC: Uninstall failed - %r\n", Status));
616 Status =
gBS->LocateProtocol (
622 if (!EFI_ERROR (Status)) {
628 Status =
gBS->InstallMultipleProtocolInterfaces (
635 if (EFI_ERROR (Status)) {
#define ARRAY_SIZE(Array)
#define EFI_SMC_NOT_WRITABLE
#define EFI_SMC_BAD_PARAMETER
#define SMC_KEY_ATTRIBUTE_READ
#define SMC_KEY_ATTRIBUTE_WRITE
#define SMC_KEY_IS_VALID_CHAR(x)
#define EFI_SMC_UNSUPPORTED_FEATURE
#define EFI_SMC_KEY_MISMATCH
#define EFI_SMC_NOT_FOUND
#define APPLE_SMC_IO_PROTOCOL_REVISION
EFI_GUID gAppleSmcIoProtocolGuid
DMG_SIZE_DEVICE_PATH Size
VOID AesCbcDecryptBuffer(IN OUT AES_CONTEXT *Context, IN OUT UINT8 *Data, IN UINT32 Len)
#define CONFIG_AES_KEY_SIZE
VOID AesInitCtxIv(OUT AES_CONTEXT *Context, IN CONST UINT8 *Key, IN CONST UINT8 *Iv)
VOID * SecureZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
UINT8 OcRtcRead(IN UINT8 Offset)
VOID OcRtcWrite(IN UINT8 Offset, IN UINT8 Value)
STATIC VIRTUALSMC_KEY_VALUE mVirtualSmcKeyValue[6]
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcMakeKey(IN CHAR8 *Name, OUT SMC_KEY *Key)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcGetKeyCount(IN APPLE_SMC_IO_PROTOCOL *This, OUT UINT32 *Count)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnknown3(IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Ukn1, IN UINTN Ukn2)
STATIC VOID LoadAuthenticationKey(VOID)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnknown1(VOID)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnknown5(IN APPLE_SMC_IO_PROTOCOL *This, IN UINT8 *Data)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcFlashAuth(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_FLASH_SIZE Size, IN SMC_DATA *Data)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcFlashWrite(IN APPLE_SMC_IO_PROTOCOL *This, IN UINT32 Unknown, IN SMC_FLASH_SIZE Size, IN SMC_DATA *Data)
STATIC CONST UINT8 mAuthenticationKeyIndex
APPLE_SMC_IO_PROTOCOL * OcSmcIoInstallProtocol(IN BOOLEAN Reinstall, IN BOOLEAN AuthRestart)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnknown2(IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Ukn1, IN UINTN Ukn2)
STATIC APPLE_SMC_IO_PROTOCOL mSmcIoProtocol
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcGetKeyInfo(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, OUT SMC_DATA_SIZE *Size, OUT SMC_KEY_TYPE *Type, OUT SMC_KEY_ATTRIBUTES *Attributes)
STATIC EFI_EVENT mAuthenticationKeyEraseEvent
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcWriteValue(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, IN SMC_DATA_SIZE Size, IN SMC_DATA *Value)
STATIC VOID ExportStatusKey(VOID)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcFlashType(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_FLASH_TYPE Type)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcReadValue(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, IN SMC_DATA_SIZE Size, OUT SMC_DATA *Value)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcReset(IN APPLE_SMC_IO_PROTOCOL *This, IN UINT32 Mode)
STATIC BOOLEAN ExtractAuthentificationKey(UINT8 *Buffer, UINT32 Size)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnknown4(IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Ukn1)
STATIC VOID EFIAPI EraseAuthenticationKey(IN EFI_EVENT Event, IN VOID *Context)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcGetKeyFromIndex(IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY_INDEX Index, OUT SMC_KEY *Key)
STATIC EFI_STATUS EFIAPI SmcIoVirtualSmcUnsupported(VOID)
#define VIRTUALSMC_ENCRYPTION_KEY
#define VIRTUALSMC_STATUS_KEY
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
EFI_GUID gOcWriteOnlyVariableGuid
EFI_STATUS OcSetSystemVariable(IN CHAR16 *VariableName, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data, IN EFI_GUID *VendorGuid OPTIONAL)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
SMC_KEY_ATTRIBUTES Attributes