10#include <Library/BaseMemoryLib.h>
11#include <Library/DebugLib.h>
12#include <Library/MemoryAllocationLib.h>
14#include <Library/UefiBootServicesTableLib.h>
16#include <Protocol/Hash.h>
17#include <Protocol/ServiceBinding.h>
30 IN CONST EFI_HASH_PROTOCOL *This,
31 IN CONST EFI_GUID *HashAlgorithm,
35 if (!HashAlgorithm || !HashSize) {
36 return EFI_INVALID_PARAMETER;
39 if (
CompareGuid (&gEfiHashAlgorithmMD5Guid, HashAlgorithm)) {
40 *HashSize =
sizeof (EFI_MD5_HASH);
42 }
else if (
CompareGuid (&gEfiHashAlgorithmSha1Guid, HashAlgorithm)) {
43 *HashSize =
sizeof (EFI_SHA1_HASH);
45 }
else if (
CompareGuid (&gEfiHashAlgorithmSha256Guid, HashAlgorithm)) {
46 *HashSize =
sizeof (EFI_SHA256_HASH);
50 return EFI_UNSUPPORTED;
57 IN CONST EFI_HASH_PROTOCOL *This,
58 IN CONST EFI_GUID *HashAlgorithm,
60 IN CONST UINT8 *Message,
61 IN UINT64 MessageSize,
62 IN OUT EFI_HASH_OUTPUT *
Hash
68 if (!This || !HashAlgorithm || !Message || !
Hash || !MessageSize || (MessageSize > MAX_UINTN)) {
69 return EFI_INVALID_PARAMETER;
74 if (
CompareGuid (&gEfiHashAlgorithmMD5Guid, HashAlgorithm)) {
80 CopyMem (&CtxCopy, &PrivateData->
Ctx, sizeof (PrivateData->
Ctx));
83 }
else if (
CompareGuid (&gEfiHashAlgorithmSha1Guid, HashAlgorithm)) {
89 CopyMem (&CtxCopy, &PrivateData->
Ctx, sizeof (PrivateData->
Ctx));
92 }
else if (
CompareGuid (&gEfiHashAlgorithmSha256Guid, HashAlgorithm)) {
98 CopyMem (&CtxCopy, &PrivateData->
Ctx, sizeof (PrivateData->
Ctx));
103 return EFI_UNSUPPORTED;
110 IN EFI_SERVICE_BINDING_PROTOCOL *This,
111 IN OUT EFI_HANDLE *ChildHandle
117 PrivateData = AllocateZeroPool (
sizeof (*PrivateData));
119 return EFI_OUT_OF_RESOURCES;
126 Status =
gBS->InstallProtocolInterface (
128 &gEfiHashProtocolGuid,
129 EFI_NATIVE_INTERFACE,
133 if (EFI_ERROR (Status)) {
134 FreePool (PrivateData);
144 IN EFI_SERVICE_BINDING_PROTOCOL *This,
145 IN EFI_HANDLE ChildHandle
148 EFI_HASH_PROTOCOL *HashProto;
151 if (!This || !ChildHandle) {
152 return EFI_INVALID_PARAMETER;
155 Status =
gBS->HandleProtocol (
157 &gEfiHashProtocolGuid,
161 if (EFI_ERROR (Status)) {
165 Status =
gBS->UninstallProtocolInterface (
167 &gEfiHashProtocolGuid,
171 if (EFI_ERROR (Status)) {
187EFI_SERVICE_BINDING_PROTOCOL *
193 EFI_HANDLE NewHandle = NULL;
194 EFI_SERVICE_BINDING_PROTOCOL *OriginalProto = NULL;
201 if (EFI_ERROR (Status)) {
202 DEBUG ((DEBUG_ERROR,
"OCHS: Uninstall failed - %r\n", Status));
206 Status =
gBS->LocateProtocol (
207 &gEfiHashServiceBindingProtocolGuid,
209 (VOID **)&OriginalProto
211 if (!EFI_ERROR (Status)) {
212 return OriginalProto;
219 Status =
gBS->InstallMultipleProtocolInterfaces (
221 &gEfiHashServiceBindingProtocolGuid,
225 if (EFI_ERROR (Status)) {
VOID Sha256Init(SHA256_CONTEXT *Context)
VOID Sha1Update(SHA1_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID Sha1Init(SHA1_CONTEXT *Context)
VOID Md5Init(MD5_CONTEXT *Context)
VOID Md5Final(MD5_CONTEXT *Context, UINT8 *Hash)
VOID Sha256Final(SHA256_CONTEXT *Context, UINT8 *HashDigest)
VOID Sha1Final(SHA1_CONTEXT *Context, UINT8 *Hash)
VOID Sha256Update(SHA256_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID Md5Update(MD5_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
EFI_SERVICE_BINDING_PROTOCOL * OcHashServicesInstallProtocol(IN BOOLEAN Reinstall)
STATIC EFI_SERVICE_BINDING_PROTOCOL mHashBindingProto
STATIC EFI_STATUS EFIAPI HSDestroyChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle)
STATIC EFI_STATUS EFIAPI HSGetHashSize(IN CONST EFI_HASH_PROTOCOL *This, IN CONST EFI_GUID *HashAlgorithm, OUT UINTN *HashSize)
STATIC EFI_STATUS EFIAPI HSCreateChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle)
STATIC EFI_STATUS EFIAPI 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)
#define HS_PRIVATE_FROM_PROTO(a)
#define HS_PRIVATE_SIGNATURE
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)