#include #include #include EFI_STATUS EFIAPI UefiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { UINT8 *Payload = NULL; /* Step 1 */ EFI_VARIABLE_AUTHENTICATION_2 AuthDesc2; SystemTable->RuntimeServices->GetTime(&AuthDesc2.TimeStamp); AuthDesc2.TimeStamp.Pad1 = 0; AuthDesc2.TimeStamp.Nanosecond = 0; AuthDesc2.TimeStamp.TimeZone = 0; AuthDesc2.TimeStamp.Daylight = 0; AuthDesc2.TimeStamp.Pad2 = 0; AuthDesc2.AuthInfo.CertType = EFI_CERT_TYPE_PKCS7_GUID; /* Step 2 hash = sha256( VariableName || VendorGuid || Attributes || AuthDesc2.TimeStamp || NewValue ); */ /* Step 3 signed_hash = pkcs#1-1.5(hash); */ /* Step 4 DERencPKCS7 = DERenc-pkcs#7-1.5(signed_hash); */ /* Step 5 AuthDesc2.AuthInfo.CertData = DERencPKCS7; */ /* Step 6 //Make Payload point to a region allocated with size of AuthDesc2 + NewDataSize Payload = Concatenate(AuthDesc2, VariableNewData); */ SystemTable->RuntimeServices->SetVariable( "variable_name", &VendorGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS, PayloadSize, Payload ); return EFI_SUCCESS; }