1 /** @file
2   This library abstract TPM2 hash calculation.
3   The platform can choose multiply hash, while caller just need invoke these API.
4   Then all hash value will be returned and/or extended.
5 
6 Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
8 
9 **/
10 
11 #ifndef _HASH_LIB_H_
12 #define _HASH_LIB_H_
13 
14 #include <Uefi.h>
15 #include <Protocol/Hash.h>
16 #include <IndustryStandard/Tpm20.h>
17 typedef UINTN  HASH_HANDLE;
18 
19 /**
20   Start hash sequence.
21 
22   @param HashHandle Hash handle.
23 
24   @retval EFI_SUCCESS          Hash sequence start and HandleHandle returned.
25   @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.
26 **/
27 EFI_STATUS
28 EFIAPI
29 HashStart (
30   OUT HASH_HANDLE    *HashHandle
31   );
32 
33 /**
34   Update hash sequence data.
35 
36   @param HashHandle    Hash handle.
37   @param DataToHash    Data to be hashed.
38   @param DataToHashLen Data size.
39 
40   @retval EFI_SUCCESS     Hash sequence updated.
41 **/
42 EFI_STATUS
43 EFIAPI
44 HashUpdate (
45   IN HASH_HANDLE    HashHandle,
46   IN VOID           *DataToHash,
47   IN UINTN          DataToHashLen
48   );
49 
50 /**
51   Hash sequence complete and extend to PCR.
52 
53   @param HashHandle    Hash handle.
54   @param PcrIndex      PCR to be extended.
55   @param DataToHash    Data to be hashed.
56   @param DataToHashLen Data size.
57   @param DigestList    Digest list.
58 
59   @retval EFI_SUCCESS     Hash sequence complete and DigestList is returned.
60 **/
61 EFI_STATUS
62 EFIAPI
63 HashCompleteAndExtend (
64   IN HASH_HANDLE         HashHandle,
65   IN TPMI_DH_PCR         PcrIndex,
66   IN VOID                *DataToHash,
67   IN UINTN               DataToHashLen,
68   OUT TPML_DIGEST_VALUES *DigestList
69   );
70 
71 /**
72   Hash data and extend to PCR.
73 
74   @param PcrIndex      PCR to be extended.
75   @param DataToHash    Data to be hashed.
76   @param DataToHashLen Data size.
77   @param DigestList    Digest list.
78 
79   @retval EFI_SUCCESS     Hash data and DigestList is returned.
80 **/
81 EFI_STATUS
82 EFIAPI
83 HashAndExtend (
84   IN TPMI_DH_PCR                    PcrIndex,
85   IN VOID                           *DataToHash,
86   IN UINTN                          DataToHashLen,
87   OUT TPML_DIGEST_VALUES            *DigestList
88   );
89 
90 /**
91   Start hash sequence.
92 
93   @param HashHandle Hash handle.
94 
95   @retval EFI_SUCCESS          Hash sequence start and HandleHandle returned.
96   @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.
97 **/
98 typedef
99 EFI_STATUS
100 (EFIAPI *HASH_INIT) (
101   OUT HASH_HANDLE    *HashHandle
102   );
103 
104 /**
105   Update hash sequence data.
106 
107   @param HashHandle    Hash handle.
108   @param DataToHash    Data to be hashed.
109   @param DataToHashLen Data size.
110 
111   @retval EFI_SUCCESS     Hash sequence updated.
112 **/
113 typedef
114 EFI_STATUS
115 (EFIAPI *HASH_UPDATE) (
116   IN HASH_HANDLE    HashHandle,
117   IN VOID           *DataToHash,
118   IN UINTN          DataToHashLen
119   );
120 
121 /**
122   Complete hash sequence complete.
123 
124   @param HashHandle    Hash handle.
125   @param DigestList    Digest list.
126 
127   @retval EFI_SUCCESS     Hash sequence complete and DigestList is returned.
128 **/
129 typedef
130 EFI_STATUS
131 (EFIAPI *HASH_FINAL) (
132   IN HASH_HANDLE         HashHandle,
133   OUT TPML_DIGEST_VALUES *DigestList
134   );
135 
136 #define HASH_ALGORITHM_SHA1_GUID    EFI_HASH_ALGORITHM_SHA1_GUID
137 #define HASH_ALGORITHM_SHA256_GUID  EFI_HASH_ALGORITHM_SHA256_GUID
138 #define HASH_ALGORITHM_SHA384_GUID  EFI_HASH_ALGORITHM_SHA384_GUID
139 #define HASH_ALGORITHM_SHA512_GUID  EFI_HASH_ALGORITHM_SHA512_GUID
140 #define HASH_ALGORITHM_SM3_256_GUID \
141   { \
142     0x251C7818, 0x0DBF, 0xE619, { 0x7F, 0xC2, 0xD6, 0xAC, 0x43, 0x42, 0x7D, 0xA3 } \
143   }
144 
145 typedef struct {
146   EFI_GUID                           HashGuid;
147   HASH_INIT                          HashInit;
148   HASH_UPDATE                        HashUpdate;
149   HASH_FINAL                         HashFinal;
150 } HASH_INTERFACE;
151 
152 /**
153   This service register Hash.
154 
155   @param HashInterface  Hash interface
156 
157   @retval EFI_SUCCESS          This hash interface is registered successfully.
158   @retval EFI_UNSUPPORTED      System does not support register this interface.
159   @retval EFI_ALREADY_STARTED  System already register this interface.
160 **/
161 EFI_STATUS
162 EFIAPI
163 RegisterHashInterfaceLib (
164   IN HASH_INTERFACE   *HashInterface
165   );
166 
167 #endif
168