20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/DebugLib.h>
23#include <Library/MemoryAllocationLib.h>
28#include <Library/UefiBootServicesTableLib.h>
29#include <Library/UefiRuntimeServicesTableLib.h>
98 }
else if (Curr > 0) {
117 size_t SignatureSize,
128 ASSERT (SignatureSize > 0);
157 IN CONST CHAR8 *ModelRequest
163 if (ModelInfo != NULL) {
175 IN CONST VOID *ImageBuffer,
178 IN CONST VOID *ManifestBuffer,
179 IN UINTN ManifestSize,
180 OUT UINT8 **HashDigest OPTIONAL,
181 OUT UINTN *DigestSize OPTIONAL
190 if ( ((ImageBuffer == NULL) || (ImageSize == 0))
191 || ((ManifestBuffer == NULL) || (ManifestSize == 0))
192 || ((HashDigest == NULL) && (DigestSize != NULL))
193 || ((HashDigest != NULL) && (DigestSize == NULL))
197 return EFI_INVALID_PARAMETER;
209 "OCI4: Manifest (%u) for %08X parse fail with code %d\n",
214 return EFI_SECURITY_VIOLATION;
221 "OCI4: Verifying digest %u (%02X%02X%02X%02X) override %d %u (%02X%02X%02X%02X)\n",
242 Sha384 (Digest, ImageBuffer, ImageSize);
246 "OCI4: Matching override %02X%02X%02X%02X with %02X%02X%02X%02X - %a\n",
255 CmpResult == 0 ?
"success" :
"failure"
257 if (CmpResult == 0) {
267 if (CmpResult != 0) {
276 if (CmpResult != 0) {
277 return EFI_SECURITY_VIOLATION;
286 return EFI_SECURITY_VIOLATION;
293 return EFI_SECURITY_VIOLATION;
309 return EFI_SECURITY_VIOLATION;
312 if (HashDigest != NULL) {
314 if (*HashDigest == NULL) {
315 return EFI_OUT_OF_RESOURCES;
326 IN CONST UINT8 *OriginalDigest,
327 IN CONST UINT8 *Image,
331 ASSERT (OriginalDigest != NULL);
342 IN CONST CHAR8 *Model,
343 IN UINT64 Ecid OPTIONAL
373 Status =
gRT->SetVariable (
376 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
380 if (EFI_ERROR (Status)) {
384 Status =
gRT->SetVariable (
387 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
391 if (EFI_ERROR (Status)) {
396 Status =
gRT->SetVariable (
399 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
403 if (EFI_ERROR (Status)) {
407 Status =
gRT->SetVariable (
410 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
414 if (EFI_ERROR (Status)) {
418 Status =
gRT->SetVariable (
421 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
425 if (EFI_ERROR (Status)) {
429 Status =
gRT->SetVariable (
430 L
"ApProductionStatus",
432 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
436 if (EFI_ERROR (Status)) {
440 Status =
gRT->SetVariable (
443 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
447 if (EFI_ERROR (Status)) {
451 Status =
gRT->SetVariable (
452 L
"EffectiveProductionStatus",
454 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
458 if (EFI_ERROR (Status)) {
462 Status =
gRT->SetVariable (
463 L
"EffectiveSecurityMode",
465 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
469 if (EFI_ERROR (Status)) {
473 Status =
gRT->SetVariable (
474 L
"InternalUseOnlyUnit",
476 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
480 if (EFI_ERROR (Status)) {
485 Status =
gRT->SetVariable (
486 L
"MixNMatchPreventionStatus",
488 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
492 if (EFI_ERROR (Status)) {
496 Status =
gRT->SetVariable (
497 L
"CryptoDigestMethod",
499 EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
503 if (EFI_ERROR (Status)) {
526 if (EFI_ERROR (Status)) {
527 DEBUG ((DEBUG_ERROR,
"OCI4: Uninstall failed - %r\n", Status));
531 Status =
gBS->LocateProtocol (
536 if (!EFI_ERROR (Status)) {
542 Status =
gBS->InstallMultipleProtocolInterfaces (
545 (VOID **)&Img4Verification,
548 if (EFI_ERROR (Status)) {
552 return &Img4Verification;
#define APPLE_IMG4_VERIFICATION_PROTOCOL_REVISION
EFI_GUID gAppleImg4VerificationProtocolGuid
#define ARRAY_SIZE(Array)
EFI_DEVICE_PATH_PROTOCOL End
EFI_GUID gAppleSecureBootVariableGuid
DERReturn DERImg4ParseManifest(DERImg4ManifestInfo *ManInfo, const void *ManBuffer, size_t ManSize, uint32_t ObjType)
const DERItem oidSha512Rsa
const DERItem oidSha384Rsa
VOID OcAppleImg4RegisterOverride(IN CONST UINT8 *OriginalDigest, IN CONST UINT8 *Image, IN UINT32 ImageSize)
CONST CHAR8 * OcAppleImg4GetHardwareModel(IN CONST CHAR8 *ModelRequest)
GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 * DERImg4RootCertificate
STATIC UINT8 mOriginalDigest[SHA384_DIGEST_SIZE]
STATIC UINT8 mOverrideDigest[SHA384_DIGEST_SIZE]
STATIC BOOLEAN mHasDigestOverride
EFI_STATUS EFIAPI OcAppleImg4Verify(IN APPLE_IMG4_VERIFICATION_PROTOCOL *This, IN UINT32 ObjType, IN CONST VOID *ImageBuffer, IN UINTN ImageSize, IN UINT8 SbMode, IN CONST VOID *ManifestBuffer, IN UINTN ManifestSize, OUT UINT8 **HashDigest OPTIONAL, OUT UINTN *DigestSize OPTIONAL)
STATIC CHAR8 mCryptoDigestMethod[16]
STATIC OC_SB_MODEL_DESC mModelInformation[]
GLOBAL_REMOVE_IF_UNREFERENCED const UINTN * DERImg4RootCertificateSize
APPLE_IMG4_VERIFICATION_PROTOCOL * OcAppleImg4VerificationInstallProtocol(IN BOOLEAN Reinstall)
STATIC DERImg4Environment mEnvInfo
EFI_STATUS OcAppleImg4BootstrapValues(IN CONST CHAR8 *Model, IN UINT64 Ecid OPTIONAL)
STATIC OC_SB_MODEL_DESC * InternalGetModelInfo(IN CONST CHAR8 *Model)
struct OC_SB_MODEL_DESC_ OC_SB_MODEL_DESC
bool DERImg4VerifySignature(DERByte *Modulus, DERSize ModulusSize, uint32_t Exponent, const uint8_t *Signature, size_t SignatureSize, uint8_t *Data, size_t DataSize, const DERItem *AlgoOid)
#define OC_SB_MODEL_LEGACY
CONST UINT8 gAppleX86SecureBootRootCaCert[]
CONST UINTN gAppleX86SecureBootRootCaCertSize
VOID Sha384(UINT8 *Hash, CONST UINT8 *Data, UINTN Len)
INTN SigVerifyShaHashBySize(IN CONST VOID *Data, IN UINTN DataSize, IN CONST UINT8 *Hash, IN UINTN HashSize)
enum OC_SIG_HASH_TYPE_ OC_SIG_HASH_TYPE
BOOLEAN RsaVerifySigDataFromData(IN CONST UINT8 *Modulus, IN UINTN ModulusSize, IN UINT32 Exponent, IN CONST UINT8 *Signature, IN UINTN SignatureSize, IN CONST UINT8 *Data, IN UINTN DataSize, IN OC_SIG_HASH_TYPE Algorithm)
#define SHA384_DIGEST_SIZE
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
APPLE_EVENT_HANDLE Handle
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
const DERItem oidSha256Rsa
bool DEROidCompare(const DERItem *oid1, const DERItem *oid2)
bool effectiveSecurityMode
bool effectiveProductionStatus
uint32_t certificateEpoch
uint8_t imageDigest[DER_IMG4_MAX_DIGEST_SIZE]
bool hasEffectiveSecurityMode
DERImg4Environment environment
bool hasEffectiveProductionStatus
CONST CHAR8 * HardwareModel