]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Test/UnitTest/Library/BaseCryptLib/HkdfTests.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / CryptoPkg / Test / UnitTest / Library / BaseCryptLib / HkdfTests.c
CommitLineData
b19793a2
QZ
1/** @file\r
2 Application for Hkdf Primitives Validation.\r
3\r
4Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
5SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include "TestBaseCryptLib.h"\r
10\r
11/**\r
12 * HKDF KAT from RFC 5869 Appendix A. Test Vectors\r
13 * https://www.rfc-editor.org/rfc/rfc5869.html\r
14 **/\r
15UINT8 mHkdfSha256Ikm[22] = {\r
16 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,\r
17 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,\r
18 0x0b, 0x0b\r
19};\r
20\r
21UINT8 mHkdfSha256Salt[13] = {\r
22 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,\r
23 0x0a, 0x0b, 0x0c,\r
24};\r
25\r
26UINT8 mHkdfSha256Info[10] = {\r
27 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,\r
28};\r
29\r
30UINT8 mHkdfSha256Prk[32] = {\r
31 0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf, 0x0d, 0xdc,\r
32 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63, 0x90, 0xb6, 0xc7, 0x3b,\r
33 0xb5, 0x0f, 0x9c, 0x31, 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2,\r
34 0xb3, 0xe5,\r
35};\r
36\r
37UINT8 mHkdfSha256Okm[42] = {\r
38 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43,\r
39 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90,\r
40 0xcf, 0x1a, 0x5a, 0x4c, 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4,\r
41 0xc5, 0xbf, 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,\r
42 0x58, 0x65,\r
43};\r
44\r
45/**\r
46 * This Hkdf-Sha384 test vector is form Project Wycheproof\r
47 * developed and maintained by members of Google Security Team.\r
48 * https://github.com/google/wycheproof/blob/master/testvectors/hkdf_sha384_test.json\r
49 **/\r
50UINT8 mHkdfSha384Ikm[16] = {\r
51 0x86, 0x77, 0xdc, 0x79, 0x23, 0x3e, 0xf3, 0x48, 0x07, 0x77,\r
52 0xc4, 0xc6, 0x01, 0xef, 0x4f, 0x0b,\r
53};\r
54\r
55UINT8 mHkdfSha384Salt[16] = {\r
56 0xad, 0x88, 0xdb, 0x71, 0x82, 0x44, 0xe2, 0xcb, 0x60, 0xe3,\r
57 0x5f, 0x87, 0x4d, 0x7a, 0xd8, 0x1f,\r
58};\r
59\r
60UINT8 mHkdfSha384Info[20] = {\r
61 0xa3, 0x8f, 0x63, 0x4d, 0x94, 0x78, 0x19, 0xa9, 0xbf, 0xa7,\r
62 0x92, 0x17, 0x4b, 0x42, 0xba, 0xa2, 0x0c, 0x9f, 0xce, 0x15,\r
63};\r
64\r
65UINT8 mHkdfSha384Prk[48] = {\r
66 0x60, 0xae, 0xa0, 0xde, 0xca, 0x97, 0x62, 0xaa, 0x43, 0xaf,\r
67 0x0e, 0x77, 0xa8, 0x0f, 0xb7, 0x76, 0xd0, 0x08, 0x19, 0x62,\r
68 0xf8, 0x30, 0xb5, 0x0d, 0x92, 0x08, 0x92, 0x7a, 0x8a, 0xd5,\r
69 0x6a, 0x3d, 0xc4, 0x4a, 0x5d, 0xfe, 0xb6, 0xb4, 0x79, 0x2f,\r
70 0x97, 0x92, 0x71, 0xe6, 0xcb, 0x08, 0x86, 0x52,\r
71};\r
72\r
73UINT8 mHkdfSha384Okm[64] = {\r
74 0x75, 0x85, 0x46, 0x36, 0x2a, 0x07, 0x0c, 0x0f, 0x13, 0xcb,\r
75 0xfb, 0xf1, 0x75, 0x6e, 0x8f, 0x29, 0xb7, 0x81, 0x9f, 0xb9,\r
76 0x03, 0xc7, 0xed, 0x4f, 0x97, 0xa5, 0x6b, 0xe3, 0xc8, 0xf8,\r
77 0x1e, 0x8c, 0x37, 0xae, 0xf5, 0xc0, 0xf8, 0xe5, 0xd2, 0xb1,\r
78 0x7e, 0xb1, 0xaa, 0x02, 0xec, 0x04, 0xc3, 0x3f, 0x54, 0x6c,\r
79 0xb2, 0xf3, 0xd1, 0x93, 0xe9, 0x30, 0xa9, 0xf8, 0x9e, 0xc9,\r
80 0xce, 0x3a, 0x82, 0xb5\r
81};\r
82\r
83UNIT_TEST_STATUS\r
84EFIAPI\r
85TestVerifyHkdfSha256 (\r
86 IN UNIT_TEST_CONTEXT Context\r
87 )\r
88{\r
89 UINT8 PrkOut[32];\r
90 UINT8 Out[42];\r
91 BOOLEAN Status;\r
92\r
93 /* HKDF-SHA-256 digest Validation*/\r
94\r
95 ZeroMem (PrkOut, sizeof (PrkOut));\r
96 Status = HkdfSha256Extract (\r
97 mHkdfSha256Ikm,\r
98 sizeof (mHkdfSha256Ikm),\r
99 mHkdfSha256Salt,\r
100 sizeof (mHkdfSha256Salt),\r
101 PrkOut,\r
102 sizeof (PrkOut)\r
103 );\r
104 UT_ASSERT_TRUE (Status);\r
105\r
106 UT_ASSERT_MEM_EQUAL (PrkOut, mHkdfSha256Prk, sizeof (mHkdfSha256Prk));\r
107\r
108 ZeroMem (Out, sizeof (Out));\r
109 Status = HkdfSha256Expand (\r
110 mHkdfSha256Prk,\r
111 sizeof (mHkdfSha256Prk),\r
112 mHkdfSha256Info,\r
113 sizeof (mHkdfSha256Info),\r
114 Out,\r
115 sizeof (Out)\r
116 );\r
117 UT_ASSERT_TRUE (Status);\r
118\r
119 UT_ASSERT_MEM_EQUAL (Out, mHkdfSha256Okm, sizeof (mHkdfSha256Okm));\r
120\r
121 ZeroMem (Out, sizeof (Out));\r
122 Status = HkdfSha256ExtractAndExpand (\r
123 mHkdfSha256Ikm,\r
124 sizeof (mHkdfSha256Ikm),\r
125 mHkdfSha256Salt,\r
126 sizeof (mHkdfSha256Salt),\r
127 mHkdfSha256Info,\r
128 sizeof (mHkdfSha256Info),\r
129 Out,\r
130 sizeof (Out)\r
131 );\r
132 UT_ASSERT_TRUE (Status);\r
133\r
134 UT_ASSERT_MEM_EQUAL (Out, mHkdfSha256Okm, sizeof (mHkdfSha256Okm));\r
135\r
136 return UNIT_TEST_PASSED;\r
137}\r
138\r
139UNIT_TEST_STATUS\r
140EFIAPI\r
141TestVerifyHkdfSha384 (\r
142 IN UNIT_TEST_CONTEXT Context\r
143 )\r
144{\r
145 UINT8 PrkOut[48];\r
146 UINT8 Out[64];\r
147 BOOLEAN Status;\r
148\r
149 /* HKDF-SHA-384 digest Validation*/\r
150 ZeroMem (PrkOut, sizeof (PrkOut));\r
151 Status = HkdfSha384Extract (\r
152 mHkdfSha384Ikm,\r
153 sizeof (mHkdfSha384Ikm),\r
154 mHkdfSha384Salt,\r
155 sizeof (mHkdfSha384Salt),\r
156 PrkOut,\r
157 sizeof (PrkOut)\r
158 );\r
159 UT_ASSERT_TRUE (Status);\r
160\r
161 UT_ASSERT_MEM_EQUAL (PrkOut, mHkdfSha384Prk, sizeof (mHkdfSha384Prk));\r
162\r
163 ZeroMem (Out, sizeof (Out));\r
164 Status = HkdfSha384Expand (\r
165 mHkdfSha384Prk,\r
166 sizeof (mHkdfSha384Prk),\r
167 mHkdfSha384Info,\r
168 sizeof (mHkdfSha384Info),\r
169 Out,\r
170 sizeof (Out)\r
171 );\r
172 UT_ASSERT_TRUE (Status);\r
173\r
174 UT_ASSERT_MEM_EQUAL (Out, mHkdfSha384Okm, sizeof (mHkdfSha384Okm));\r
175\r
176 ZeroMem (Out, sizeof (Out));\r
177 Status = HkdfSha384ExtractAndExpand (\r
178 mHkdfSha384Ikm,\r
179 sizeof (mHkdfSha384Ikm),\r
180 mHkdfSha384Salt,\r
181 sizeof (mHkdfSha384Salt),\r
182 mHkdfSha384Info,\r
183 sizeof (mHkdfSha384Info),\r
184 Out,\r
185 sizeof (Out)\r
186 );\r
187 UT_ASSERT_TRUE (Status);\r
188\r
189 UT_ASSERT_MEM_EQUAL (Out, mHkdfSha384Okm, sizeof (mHkdfSha384Okm));\r
190\r
191 return UNIT_TEST_PASSED;\r
192}\r
193\r
194TEST_DESC mHkdfTest[] = {\r
195 //\r
196 // -----Description--------------------------------------Class----------------------Function---------------------------------Pre---------------------Post---------Context\r
197 //\r
198 { "TestVerifyHkdfSha256()", "CryptoPkg.BaseCryptLib.Hkdf", TestVerifyHkdfSha256, NULL, NULL, NULL },\r
199 { "TestVerifyHkdfSha384()", "CryptoPkg.BaseCryptLib.Hkdf", TestVerifyHkdfSha384, NULL, NULL, NULL },\r
200};\r
201\r
202UINTN mHkdfTestNum = ARRAY_SIZE (mHkdfTest);\r