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