]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Library/HashInstanceLibSha512/HashInstanceLibSha512.c
d5389e1e22090f2fb51456c6e6446f72a17a0c3d
[mirror_edk2.git] / SecurityPkg / Library / HashInstanceLibSha512 / HashInstanceLibSha512.c
1 /** @file
2 This library is BaseCrypto SHA512 hash instance.
3 It can be registered to BaseCrypto router, to serve as hash engine.
4
5 Copyright (c) 2018, Intel Corporation. All rights reserved. <BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <PiPei.h>
11 #include <Library/BaseLib.h>
12 #include <Library/BaseMemoryLib.h>
13 #include <Library/DebugLib.h>
14 #include <Library/BaseCryptLib.h>
15 #include <Library/MemoryAllocationLib.h>
16 #include <Library/HashLib.h>
17
18 /**
19 The function set SHA512 to digest list.
20
21 @param DigestList digest list
22 @param Sha512Digest SHA512 digest
23 **/
24 VOID
25 Tpm2SetSha512ToDigestList (
26 IN TPML_DIGEST_VALUES *DigestList,
27 IN UINT8 *Sha512Digest
28 )
29 {
30 DigestList->count = 1;
31 DigestList->digests[0].hashAlg = TPM_ALG_SHA512;
32 CopyMem (
33 DigestList->digests[0].digest.sha512,
34 Sha512Digest,
35 SHA512_DIGEST_SIZE
36 );
37 }
38
39 /**
40 Start hash sequence.
41
42 @param HashHandle Hash handle.
43
44 @retval EFI_SUCCESS Hash sequence start and HandleHandle returned.
45 @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.
46 **/
47 EFI_STATUS
48 EFIAPI
49 Sha512HashInit (
50 OUT HASH_HANDLE *HashHandle
51 )
52 {
53 VOID *Sha512Ctx;
54 UINTN CtxSize;
55
56 CtxSize = Sha512GetContextSize ();
57 Sha512Ctx = AllocatePool (CtxSize);
58 ASSERT (Sha512Ctx != NULL);
59
60 Sha512Init (Sha512Ctx);
61
62 *HashHandle = (HASH_HANDLE)Sha512Ctx;
63
64 return EFI_SUCCESS;
65 }
66
67 /**
68 Update hash sequence data.
69
70 @param HashHandle Hash handle.
71 @param DataToHash Data to be hashed.
72 @param DataToHashLen Data size.
73
74 @retval EFI_SUCCESS Hash sequence updated.
75 **/
76 EFI_STATUS
77 EFIAPI
78 Sha512HashUpdate (
79 IN HASH_HANDLE HashHandle,
80 IN VOID *DataToHash,
81 IN UINTN DataToHashLen
82 )
83 {
84 VOID *Sha512Ctx;
85
86 Sha512Ctx = (VOID *)HashHandle;
87 Sha512Update (Sha512Ctx, DataToHash, DataToHashLen);
88
89 return EFI_SUCCESS;
90 }
91
92 /**
93 Complete hash sequence complete.
94
95 @param HashHandle Hash handle.
96 @param DigestList Digest list.
97
98 @retval EFI_SUCCESS Hash sequence complete and DigestList is returned.
99 **/
100 EFI_STATUS
101 EFIAPI
102 Sha512HashFinal (
103 IN HASH_HANDLE HashHandle,
104 OUT TPML_DIGEST_VALUES *DigestList
105 )
106 {
107 UINT8 Digest[SHA512_DIGEST_SIZE];
108 VOID *Sha512Ctx;
109
110 Sha512Ctx = (VOID *)HashHandle;
111 Sha512Final (Sha512Ctx, Digest);
112
113 FreePool (Sha512Ctx);
114
115 Tpm2SetSha512ToDigestList (DigestList, Digest);
116
117 return EFI_SUCCESS;
118 }
119
120 HASH_INTERFACE mSha512InternalHashInstance = {
121 HASH_ALGORITHM_SHA512_GUID,
122 Sha512HashInit,
123 Sha512HashUpdate,
124 Sha512HashFinal,
125 };
126
127 /**
128 The function register SHA512 instance.
129
130 @retval EFI_SUCCESS SHA512 instance is registered, or system dose not surpport registr SHA512 instance
131 **/
132 EFI_STATUS
133 EFIAPI
134 HashInstanceLibSha512Constructor (
135 VOID
136 )
137 {
138 EFI_STATUS Status;
139
140 Status = RegisterHashInterfaceLib (&mSha512InternalHashInstance);
141 if ((Status == EFI_SUCCESS) || (Status == EFI_UNSUPPORTED)) {
142 //
143 // Unsupported means platform policy does not need this instance enabled.
144 //
145 return EFI_SUCCESS;
146 }
147 return Status;
148 }