• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   This library is BaseCrypto SHA256 hash instance.
3   It can be registered to BaseCrypto router, to serve as hash engine.
4 
5 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include <PiPei.h>
17 #include <Library/BaseLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/Tpm2CommandLib.h>
20 #include <Library/DebugLib.h>
21 #include <Library/BaseCryptLib.h>
22 #include <Library/MemoryAllocationLib.h>
23 #include <Library/HashLib.h>
24 
25 /**
26   The function set SHA256 to digest list.
27 
28   @param DigestList   digest list
29   @param Sha256Digest SHA256 digest
30 **/
31 VOID
Tpm2SetSha256ToDigestList(IN TPML_DIGEST_VALUES * DigestList,IN UINT8 * Sha256Digest)32 Tpm2SetSha256ToDigestList (
33   IN TPML_DIGEST_VALUES *DigestList,
34   IN UINT8              *Sha256Digest
35   )
36 {
37   DigestList->count = 1;
38   DigestList->digests[0].hashAlg = TPM_ALG_SHA256;
39   CopyMem (
40     DigestList->digests[0].digest.sha256,
41     Sha256Digest,
42     SHA256_DIGEST_SIZE
43     );
44 }
45 
46 /**
47   Start hash sequence.
48 
49   @param HashHandle Hash handle.
50 
51   @retval EFI_SUCCESS          Hash sequence start and HandleHandle returned.
52   @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.
53 **/
54 EFI_STATUS
55 EFIAPI
Sha256HashInit(OUT HASH_HANDLE * HashHandle)56 Sha256HashInit (
57   OUT HASH_HANDLE    *HashHandle
58   )
59 {
60   VOID     *Sha256Ctx;
61   UINTN    CtxSize;
62 
63   CtxSize = Sha256GetContextSize ();
64   Sha256Ctx = AllocatePool (CtxSize);
65   ASSERT (Sha256Ctx != NULL);
66 
67   Sha256Init (Sha256Ctx);
68 
69   *HashHandle = (HASH_HANDLE)Sha256Ctx;
70 
71   return EFI_SUCCESS;
72 }
73 
74 /**
75   Update hash sequence data.
76 
77   @param HashHandle    Hash handle.
78   @param DataToHash    Data to be hashed.
79   @param DataToHashLen Data size.
80 
81   @retval EFI_SUCCESS     Hash sequence updated.
82 **/
83 EFI_STATUS
84 EFIAPI
Sha256HashUpdate(IN HASH_HANDLE HashHandle,IN VOID * DataToHash,IN UINTN DataToHashLen)85 Sha256HashUpdate (
86   IN HASH_HANDLE    HashHandle,
87   IN VOID           *DataToHash,
88   IN UINTN          DataToHashLen
89   )
90 {
91   VOID     *Sha256Ctx;
92 
93   Sha256Ctx = (VOID *)HashHandle;
94   Sha256Update (Sha256Ctx, DataToHash, DataToHashLen);
95 
96   return EFI_SUCCESS;
97 }
98 
99 /**
100   Complete hash sequence complete.
101 
102   @param HashHandle    Hash handle.
103   @param DigestList    Digest list.
104 
105   @retval EFI_SUCCESS     Hash sequence complete and DigestList is returned.
106 **/
107 EFI_STATUS
108 EFIAPI
Sha256HashFinal(IN HASH_HANDLE HashHandle,OUT TPML_DIGEST_VALUES * DigestList)109 Sha256HashFinal (
110   IN HASH_HANDLE         HashHandle,
111   OUT TPML_DIGEST_VALUES *DigestList
112   )
113 {
114   UINT8         Digest[SHA256_DIGEST_SIZE];
115   VOID          *Sha256Ctx;
116 
117   Sha256Ctx = (VOID *)HashHandle;
118   Sha256Final (Sha256Ctx, Digest);
119 
120   FreePool (Sha256Ctx);
121 
122   Tpm2SetSha256ToDigestList (DigestList, Digest);
123 
124   return EFI_SUCCESS;
125 }
126 
127 HASH_INTERFACE  mSha256InternalHashInstance = {
128   HASH_ALGORITHM_SHA256_GUID,
129   Sha256HashInit,
130   Sha256HashUpdate,
131   Sha256HashFinal,
132 };
133 
134 /**
135   The function register SHA256 instance.
136 
137   @retval EFI_SUCCESS   SHA256 instance is registered, or system dose not surpport registr SHA256 instance
138 **/
139 EFI_STATUS
140 EFIAPI
HashInstanceLibSha256Constructor(VOID)141 HashInstanceLibSha256Constructor (
142   VOID
143   )
144 {
145   EFI_STATUS  Status;
146 
147   Status = RegisterHashInterfaceLib (&mSha256InternalHashInstance);
148   if ((Status == EFI_SUCCESS) || (Status == EFI_UNSUPPORTED)) {
149     //
150     // Unsupported means platform policy does not need this instance enabled.
151     //
152     return EFI_SUCCESS;
153   }
154   return Status;
155 }