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