diff options
Diffstat (limited to 'Core/EM/HashService')
-rw-r--r-- | Core/EM/HashService/HashService.c | 277 | ||||
-rw-r--r-- | Core/EM/HashService/HashService.cif | 10 | ||||
-rw-r--r-- | Core/EM/HashService/HashService.mak | 65 | ||||
-rw-r--r-- | Core/EM/HashService/HashService.sdl | 28 |
4 files changed, 380 insertions, 0 deletions
diff --git a/Core/EM/HashService/HashService.c b/Core/EM/HashService/HashService.c new file mode 100644 index 0000000..7518355 --- /dev/null +++ b/Core/EM/HashService/HashService.c @@ -0,0 +1,277 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Core/Modules/HashService/HashService.c 2 8/28/12 4:28p Artems $ +// +// $Revision: 2 $ +// +// $Date: 8/28/12 4:28p $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Core/Modules/HashService/HashService.c $ +// +// 2 8/28/12 4:28p Artems +// [TAG] EIP N/A +// [Category] New Feature +// [Description] Implementation of hash protocol +// [Files] HasService.c HashService.sdl +// +// 1 5/24/12 3:33p Artems +// [TAG] EIP N/A +// [Category] New Feature +// [Description] Added HashService protocol infrastructure +// [Files] HashService.cif +// HashService.sdl +// HashService.mak +// HashService.c +// +// +//********************************************************************** +//<AMI_FHDR_START> +// +// Name: HashService.c +// +// Description: +// +//<AMI_FHDR_END> +//********************************************************************** +#include <AmiDxeLib.h> +#include <Protocol\Hash.h> +#include <Protocol\DriverBinding.h> +#include <Protocol\ServiceBinding.h> +#include <Protocol\AmiDigitalSignature.h> + + +/* Dummy DriverBinding protocol */ +EFI_STATUS HashServiceDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) +{ return EFI_UNSUPPORTED; } + +EFI_STATUS HashServiceDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) +{ return EFI_UNSUPPORTED; } + +EFI_STATUS HashServiceDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer) +{ return EFI_UNSUPPORTED; } + +EFI_DRIVER_BINDING_PROTOCOL HashServiceDriverBindingProtocol = { + HashServiceDriverBindingSupported, + HashServiceDriverBindingStart, + HashServiceDriverBindingStop, + 0x10, + NULL, + NULL +}; + +static EFI_GUID AmiDigitalSignatureProtocolGuid = AMI_DIGITAL_SIGNATURE_PROTOCOL_GUID; +static AMI_DIGITAL_SIGNATURE_PROTOCOL *AmiDigitalSignatureProtocol = NULL; +static DLIST HashChildList; + +typedef struct { + DLINK Link; + EFI_HANDLE Handle; + EFI_HASH_PROTOCOL Protocol; +} HASH_CHILD_LINK; + +/* Hash service binding protocol */ +EFI_STATUS HashServiceCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN OUT EFI_HANDLE *ChildHandle +); + +EFI_STATUS HashServiceDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL*This, + IN EFI_HANDLE ChildHandle +); + +EFI_SERVICE_BINDING_PROTOCOL HashServiceBindingProtocol = { + HashServiceCreateChild, + HashServiceDestroyChild +}; + +EFI_STATUS HsGetHashSize( + IN CONST EFI_HASH_PROTOCOL *This, + IN CONST EFI_GUID *HashAlgorithm, + OUT UINTN *HashSize +) +{ + if(HashSize == NULL || This == NULL || HashAlgorithm == NULL) + return EFI_INVALID_PARAMETER; + + if(!guidcmp((EFI_GUID*)HashAlgorithm, &gEfiHashAlgorithmSha1Guid)) { + *HashSize = SHA1_DIGEST_SIZE; + } else if(!guidcmp((EFI_GUID*)HashAlgorithm, &gEfiHashAlgorithmSha256Guid)) { + *HashSize = SHA256_DIGEST_SIZE; + } else { + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +EFI_STATUS HsHash( + IN CONST EFI_HASH_PROTOCOL *This, + IN CONST EFI_GUID *HashAlgorithm, + IN BOOLEAN Extend, + IN CONST UINT8 *Message, + IN UINT64 MessageSize, + IN OUT EFI_HASH_OUTPUT *Hash +) +{ + UINTN Count; + UINTN Size[2]; + UINT8 *Chunks[2]; + UINTN HashSize; + EFI_STATUS Status; + UINT8 *Buffer; + + if(Message == NULL || Hash == NULL || This == NULL || HashAlgorithm == NULL) + return EFI_INVALID_PARAMETER; + + if(!guidcmp((EFI_GUID*)HashAlgorithm, &gEfiHashAlgorithmSha1Guid)) { + Buffer = *(Hash->Sha1Hash); + HashSize = SHA1_DIGEST_SIZE; + } else if(!guidcmp((EFI_GUID*)HashAlgorithm, &gEfiHashAlgorithmSha256Guid)) { + Buffer = *(Hash->Sha256Hash); + HashSize = SHA256_DIGEST_SIZE; + } else { + return EFI_UNSUPPORTED; + } + + if(Extend) { +/* + Count = 2; + Size[0] = (UINTN)MessageSize; + Chunks[0] = (UINT8*)Message; +*/ + return EFI_UNSUPPORTED; + } else { + Count = 1; + Size[0] = (UINTN)MessageSize; + Chunks[0] = (UINT8*)Message; + } + + Status = AmiDigitalSignatureProtocol->Hash(AmiDigitalSignatureProtocol, + HashAlgorithm, + Count, + Chunks, + Size, + Buffer); + + return Status; +} + + +EFI_STATUS HashServiceEntryPoint( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + EFI_STATUS Status; + EFI_HANDLE Handle = NULL; + + InitAmiLib(ImageHandle,SystemTable); + + Status = pBS->LocateProtocol(&AmiDigitalSignatureProtocolGuid, NULL, &AmiDigitalSignatureProtocol); + if(EFI_ERROR(Status)) + return Status; + + DListInit(&HashChildList); + + HashServiceDriverBindingProtocol.ImageHandle = ImageHandle; + HashServiceDriverBindingProtocol.DriverBindingHandle = NULL; + + Status = pBS->InstallMultipleProtocolInterfaces( + &HashServiceDriverBindingProtocol.DriverBindingHandle, + &gEfiDriverBindingProtocolGuid, + &HashServiceDriverBindingProtocol, + &gEfiHashServiceBindingProtocolGuid, + &HashServiceBindingProtocol, + NULL); + + + return Status; +} + +EFI_STATUS HashServiceCreateChild ( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN OUT EFI_HANDLE *ChildHandle +) +{ + EFI_STATUS Status; + HASH_CHILD_LINK *NewLink; + + Status = pBS->AllocatePool(EfiBootServicesData, sizeof(HASH_CHILD_LINK), &NewLink); + if(EFI_ERROR(Status)) + return Status; + + NewLink->Handle = *ChildHandle; + NewLink->Protocol.GetHashSize = HsGetHashSize; + NewLink->Protocol.Hash = HsHash; + + DListAdd(&HashChildList, (DLINK *)NewLink); + + Status = pBS->InstallMultipleProtocolInterfaces(&(NewLink->Handle), &gEfiHashProtocolGuid, &(NewLink->Protocol), NULL); + if(!EFI_ERROR(Status) && *ChildHandle == NULL) + *ChildHandle = NewLink->Handle; + + return Status; +} + +EFI_STATUS HashServiceDestroyChild ( + IN EFI_SERVICE_BINDING_PROTOCOL*This, + IN EFI_HANDLE ChildHandle +) +{ + EFI_STATUS Status; + EFI_HASH_PROTOCOL *Instance; + VOID *Start; + + Status = pBS->HandleProtocol(ChildHandle, &gEfiHashProtocolGuid, &Instance); + if(EFI_ERROR(Status)) + return Status; + + Status = pBS->UninstallMultipleProtocolInterfaces(ChildHandle, &gEfiHashProtocolGuid, Instance); + if(!EFI_ERROR(Status)) { + Start = OUTTER(Instance, Protocol, HASH_CHILD_LINK); + DListDelete(&HashChildList, (DLINK *)Start); + pBS->FreePool(Start); + } + + return Status; +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2012, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//**********************************************************************
\ No newline at end of file diff --git a/Core/EM/HashService/HashService.cif b/Core/EM/HashService/HashService.cif new file mode 100644 index 0000000..101f7af --- /dev/null +++ b/Core/EM/HashService/HashService.cif @@ -0,0 +1,10 @@ +<component> + name = "HashService" + category = ModulePart + LocalRoot = "Core\EM\HashService" + RefName = "HashService" +[files] +"HashService.sdl" +"HashService.mak" +"HashService.c" +<endComponent> diff --git a/Core/EM/HashService/HashService.mak b/Core/EM/HashService/HashService.mak new file mode 100644 index 0000000..1b747a1 --- /dev/null +++ b/Core/EM/HashService/HashService.mak @@ -0,0 +1,65 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2011, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Core/Modules/HashService/HashService.mak 1 5/24/12 3:33p Artems $ +# +# $Revision: 1 $ +# +# $Date: 5/24/12 3:33p $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Core/Modules/HashService/HashService.mak $ +# +# 1 5/24/12 3:33p Artems +# [TAG] EIP N/A +# [Category] New Feature +# [Description] Added HashService protocol infrastructure +# [Files] HashService.cif +# HashService.sdl +# HashService.mak +# HashService.c +# +# +#********************************************************************** +#<AMI_FHDR_START> +# +# Name: HashService.mak +# +# Description: Make file to create Hash Service Binding Driver +# +#<AMI_FHDR_END> +#********************************************************************** + +CORE_DXEBin : $(BUILD_DIR)\HashService.obj + +$(BUILD_DIR)\HashService.obj : $(HashService_DIR)\HashService.c + +{$(HashService_DIR)}.c{$(BUILD_DIR)}.obj:: + $(CC) $(CFLAGS) /Fo$(BUILD_DIR)\ $< + +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2011, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** diff --git a/Core/EM/HashService/HashService.sdl b/Core/EM/HashService/HashService.sdl new file mode 100644 index 0000000..9b193bd --- /dev/null +++ b/Core/EM/HashService/HashService.sdl @@ -0,0 +1,28 @@ +TOKEN + Name = "HashService_SUPPORT" + Value = "1" + Help = "Main switch to enable hash service support in Project" + TokenType = Boolean + TargetMAK = Yes + TargetH = Yes + Master = Yes + Token = "CryptoAPI_SUPPORT" "=" "1" +End + +PATH + Name = "HashService_DIR" + Help = "Path to PlatformToDriver Module in Project" +End + +MODULE + Help = "Includes HashService.mak to Project" + File = "HashService.mak" +End + +ELINK + Name = "HashServiceEntryPoint," + Parent = "BdsEntryInitialize" + InvokeOrder = AfterParent +End + + |