]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.c
SecurityPkg: Tcg2Dxe: Report correct FinalEventLog size
[mirror_edk2.git] / SecurityPkg / Hash2DxeCrypto / Hash2DxeCrypto.c
index 92cda364550642d7927e2b40d492f2061019365f..93e32739164d1165d3112b21a3b774211b93f51c 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
   This module implements Hash2 Protocol.\r
 \r
+(C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under\r
 the terms and conditions of the BSD License that accompanies this distribution.\r
@@ -63,7 +64,7 @@ BOOLEAN
 \r
   This function performs Hash digest on a data buffer of the specified size.\r
   It can be called multiple times to compute the digest of long or discontinuous data streams.\r
-  Hash context should be already correctly intialized by HashInit(), and should not be finalized\r
+  Hash context should be already correctly initialized by HashInit(), and should not be finalized\r
   by HashFinal(). Behavior with invalid context is undefined.\r
 \r
   If HashContext is NULL, then return FALSE.\r
@@ -125,6 +126,7 @@ typedef struct {
 } EFI_HASH_INFO;\r
 \r
 EFI_HASH_INFO  mHashInfo[] = {\r
+  {&gEfiHashAlgorithmMD5Guid,     sizeof(EFI_MD5_HASH2),    Md5GetContextSize,    Md5Init,    Md5Update,    Md5Final  },\r
   {&gEfiHashAlgorithmSha1Guid,    sizeof(EFI_SHA1_HASH2),   Sha1GetContextSize,   Sha1Init,   Sha1Update,   Sha1Final   },\r
   {&gEfiHashAlgorithmSha256Guid,  sizeof(EFI_SHA256_HASH2), Sha256GetContextSize, Sha256Init, Sha256Update, Sha256Final },\r
   {&gEfiHashAlgorithmSha384Guid,  sizeof(EFI_SHA384_HASH2), Sha384GetContextSize, Sha384Init, Sha384Update, Sha384Final },\r
@@ -356,6 +358,7 @@ BaseCrypto2Hash (
   UINTN                    CtxSize;\r
   BOOLEAN                  Ret;\r
   EFI_STATUS               Status;\r
+  HASH2_INSTANCE_DATA      *Instance;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -371,6 +374,13 @@ BaseCrypto2Hash (
   if (HashInfo == NULL) {\r
     return EFI_UNSUPPORTED;\r
   }\r
+  \r
+  Instance = HASH2_INSTANCE_DATA_FROM_THIS(This);\r
+  if (Instance->HashContext != NULL) {\r
+    FreePool (Instance->HashContext);\r
+  }\r
+  Instance->HashInfoContext = NULL;\r
+  Instance->HashContext = NULL;\r
 \r
   //\r
   // Start hash sequence\r
@@ -390,6 +400,12 @@ BaseCrypto2Hash (
     goto Done;\r
   }\r
 \r
+  //\r
+  // Setup the context\r
+  //\r
+  Instance->HashContext = HashCtx;\r
+  Instance->HashInfoContext = HashInfo;\r
+\r
   Ret = HashInfo->Update (HashCtx, Message, MessageSize);\r
   if (!Ret) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -402,7 +418,12 @@ BaseCrypto2Hash (
     goto Done;\r
   }\r
 Done:\r
+  //\r
+  // Cleanup the context\r
+  //\r
   FreePool (HashCtx);\r
+  Instance->HashInfoContext = NULL;\r
+  Instance->HashContext = NULL;\r
   return Status;\r
 }\r
 \r
@@ -452,7 +473,7 @@ BaseCrypto2HashInit (
   // Consistency Check\r
   //\r
   Instance = HASH2_INSTANCE_DATA_FROM_THIS(This);\r
-  if ((Instance->HashContext != NULL) || (Instance->HashInfoContext != HashInfo)) {\r
+  if ((Instance->HashContext != NULL) || (Instance->HashInfoContext != NULL)) {\r
     return EFI_ALREADY_STARTED;\r
   }\r
 \r
@@ -479,6 +500,7 @@ BaseCrypto2HashInit (
   //\r
   Instance->HashContext = HashCtx;\r
   Instance->HashInfoContext = HashInfo;\r
+  Instance->Updated = FALSE;\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -530,6 +552,8 @@ BaseCrypto2HashUpdate (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  Instance->Updated = TRUE;\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -569,7 +593,8 @@ BaseCrypto2HashFinal (
   // Consistency Check\r
   //\r
   Instance = HASH2_INSTANCE_DATA_FROM_THIS(This);\r
-  if ((Instance->HashContext == NULL) || (Instance->HashInfoContext == NULL)) {\r
+  if ((Instance->HashContext == NULL) || (Instance->HashInfoContext == NULL) ||\r
+      (!Instance->Updated)) {\r
     return EFI_NOT_READY;\r
   }\r
   HashInfo = Instance->HashInfoContext;\r
@@ -583,6 +608,7 @@ BaseCrypto2HashFinal (
   FreePool (HashCtx);\r
   Instance->HashInfoContext = NULL;\r
   Instance->HashContext = NULL;\r
+  Instance->Updated = FALSE;\r
 \r
   if (!Ret) {\r
     return EFI_OUT_OF_RESOURCES;\r