]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Test/UnitTest/Library/BaseCryptLib/EcTests.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / CryptoPkg / Test / UnitTest / Library / BaseCryptLib / EcTests.c
CommitLineData
d97ee324
YL
1/** @file\r
2 Application for Diffie-Hellman 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#define EC_CURVE_NUM_SUPPORTED 3\r
12UINTN EcCurveList[EC_CURVE_NUM_SUPPORTED] = { CRYPTO_NID_SECP256R1, CRYPTO_NID_SECP384R1, CRYPTO_NID_SECP521R1 };\r
13UINTN EcKeyHalfSize[EC_CURVE_NUM_SUPPORTED] = { 32, 48, 66 };\r
14\r
15struct Generator {\r
16 UINT8 X[66];\r
17 UINT8 Y[66];\r
18};\r
19\r
20// Generator points of all ec curve\r
21struct Generator EcCurveGenerator[EC_CURVE_NUM_SUPPORTED] =\r
22{\r
23 // CRYPTO_NID_SECP256R1\r
24 {\r
25 { 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5,\r
26 0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0,\r
27 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 },\r
28\r
29 { 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a,\r
30 0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,\r
31 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5 }\r
32 },\r
33 // CRYPTO_NID_SECP384R1\r
34 {\r
35 { 0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E,\r
36 0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98,\r
37 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D,\r
38 0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7 },\r
39\r
40 { 0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf,\r
41 0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c,\r
42 0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce,\r
43 0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f }\r
44 },\r
45 // CRYPTO_NID_SECP521R1\r
46 {\r
47 { 0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, 0x3E,\r
48 0xCB, 0x66, 0x23, 0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, 0x05, 0x3F,\r
49 0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60, 0x6B, 0x4D, 0x3D, 0xBA, 0xA1, 0x4B,\r
50 0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, 0xC1, 0x27, 0xA2, 0xFF,\r
51 0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, 0x6A, 0x42, 0x9B, 0xF9, 0x7E,\r
52 0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66 },\r
53\r
54 { 0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a,\r
55 0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b,\r
56 0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee,\r
57 0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad,\r
58 0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe,\r
59 0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50 }\r
60 }\r
61};\r
62\r
03710322
QZ
63//\r
64// Root CA X509 Certificate for X509 Verification Routine (Generated by OpenSSL utility).\r
65//\r
66GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 mEccTestRootCer[] = {\r
67 0x30, 0x82, 0x01, 0xd2, 0x30, 0x82, 0x01, 0x77, 0xa0, 0x03, 0x02, 0x01,\r
68 0x02, 0x02, 0x09, 0x00, 0xcc, 0x10, 0x45, 0x50, 0xaf, 0x50, 0x1b, 0xe2,\r
69 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\r
70 0x30, 0x45, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\r
71 0x02, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,\r
72 0x0c, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,\r
73 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x49,\r
74 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,\r
75 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x30,\r
76 0x1e, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x32, 0x32, 0x37, 0x31, 0x32, 0x30,\r
77 0x32, 0x31, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x30, 0x30, 0x32, 0x32, 0x34,\r
78 0x31, 0x32, 0x30, 0x32, 0x31, 0x30, 0x5a, 0x30, 0x45, 0x31, 0x0b, 0x30,\r
79 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x41, 0x55, 0x31, 0x13,\r
80 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x53, 0x6f, 0x6d,\r
81 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x31, 0x21, 0x30, 0x1f, 0x06,\r
82 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,\r
83 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 0x69, 0x74, 0x73, 0x20, 0x50,\r
84 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07,\r
85 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48,\r
86 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0x11, 0xa4, 0x06,\r
87 0x65, 0xb6, 0x79, 0x6e, 0x72, 0xb6, 0xd8, 0x09, 0x84, 0x92, 0x86, 0x11,\r
88 0x09, 0xde, 0xea, 0xd0, 0x0c, 0x60, 0xf1, 0x8a, 0xff, 0x7c, 0xde, 0xce,\r
89 0xec, 0x07, 0xba, 0xa5, 0xb8, 0xd5, 0x17, 0xe5, 0x62, 0x33, 0x2d, 0x88,\r
90 0xb1, 0x9a, 0xe6, 0xf3, 0x09, 0x43, 0x0e, 0xa9, 0xf7, 0x3c, 0xe9, 0x20,\r
91 0xba, 0xbd, 0xb1, 0x3c, 0x03, 0x89, 0x1e, 0x2a, 0xff, 0x6e, 0x08, 0xff,\r
92 0x2e, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,\r
93 0x04, 0x16, 0x04, 0x14, 0x62, 0xe6, 0xd9, 0xa0, 0xee, 0x38, 0x18, 0x83,\r
94 0xfa, 0xe3, 0xed, 0x44, 0xa4, 0x37, 0xfd, 0x4a, 0x04, 0xdf, 0xe1, 0xd5,\r
95 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80,\r
96 0x14, 0x62, 0xe6, 0xd9, 0xa0, 0xee, 0x38, 0x18, 0x83, 0xfa, 0xe3, 0xed,\r
97 0x44, 0xa4, 0x37, 0xfd, 0x4a, 0x04, 0xdf, 0xe1, 0xd5, 0x30, 0x0c, 0x06,\r
98 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\r
99 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,\r
100 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0x99, 0x2f, 0x43, 0xeb, 0xdc,\r
101 0x4e, 0x53, 0xc7, 0xc1, 0xbd, 0xed, 0x95, 0xdc, 0xae, 0xd3, 0x75, 0xfa,\r
102 0xc4, 0xf7, 0xa4, 0x61, 0x00, 0x57, 0xce, 0xf3, 0xe0, 0x23, 0xf6, 0xf0,\r
103 0x41, 0x6f, 0xb5, 0x02, 0x21, 0x00, 0xf3, 0x97, 0x11, 0x06, 0x61, 0x10,\r
104 0xc7, 0x35, 0xe9, 0xf8, 0x3b, 0x59, 0xec, 0xf5, 0x51, 0xa0, 0xa6, 0x64,\r
105 0x6e, 0xe1, 0x44, 0xc7, 0xe1, 0xa2, 0xce, 0x90, 0x7f, 0xae, 0xad, 0xf4,\r
106 0xa9, 0xfa,\r
107};\r
108\r
109//\r
110// PEM key data for EC Private key Retrieving. (Generated by OpenSSL utility).\r
111//\r
112GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 mEccTestPemKey[] = {\r
113 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x45,\r
114 0x43, 0x20, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53,\r
115 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x42, 0x67, 0x67, 0x71, 0x68, 0x6b,\r
116 0x6a, 0x4f, 0x50, 0x51, 0x4d, 0x42, 0x42, 0x77, 0x3d, 0x3d, 0x0a, 0x2d,\r
117 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x45, 0x43, 0x20, 0x50,\r
118 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x2d, 0x2d, 0x2d,\r
119 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49,\r
120 0x4e, 0x20, 0x45, 0x43, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45,\r
121 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x48,\r
122 0x63, 0x43, 0x41, 0x51, 0x45, 0x45, 0x49, 0x4d, 0x4a, 0x54, 0x69, 0x75,\r
123 0x34, 0x56, 0x54, 0x54, 0x57, 0x68, 0x78, 0x4b, 0x62, 0x51, 0x65, 0x78,\r
124 0x6e, 0x30, 0x43, 0x58, 0x41, 0x77, 0x33, 0x44, 0x57, 0x6b, 0x6f, 0x78,\r
125 0x79, 0x77, 0x6b, 0x7a, 0x46, 0x50, 0x62, 0x32, 0x48, 0x68, 0x5a, 0x6e,\r
126 0x5a, 0x52, 0x6f, 0x41, 0x6f, 0x47, 0x43, 0x43, 0x71, 0x47, 0x53, 0x4d,\r
127 0x34, 0x39, 0x0a, 0x41, 0x77, 0x45, 0x48, 0x6f, 0x55, 0x51, 0x44, 0x51,\r
128 0x67, 0x41, 0x45, 0x45, 0x61, 0x51, 0x47, 0x5a, 0x62, 0x5a, 0x35, 0x62,\r
129 0x6e, 0x4b, 0x32, 0x32, 0x41, 0x6d, 0x45, 0x6b, 0x6f, 0x59, 0x52, 0x43,\r
130 0x64, 0x37, 0x71, 0x30, 0x41, 0x78, 0x67, 0x38, 0x59, 0x72, 0x2f, 0x66,\r
131 0x4e, 0x37, 0x4f, 0x37, 0x41, 0x65, 0x36, 0x70, 0x62, 0x6a, 0x56, 0x46,\r
132 0x2b, 0x56, 0x69, 0x4d, 0x79, 0x32, 0x49, 0x0a, 0x73, 0x5a, 0x72, 0x6d,\r
133 0x38, 0x77, 0x6c, 0x44, 0x44, 0x71, 0x6e, 0x33, 0x50, 0x4f, 0x6b, 0x67,\r
134 0x75, 0x72, 0x32, 0x78, 0x50, 0x41, 0x4f, 0x4a, 0x48, 0x69, 0x72, 0x2f,\r
135 0x62, 0x67, 0x6a, 0x2f, 0x4c, 0x67, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d,\r
136 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x45, 0x43, 0x20, 0x50, 0x52, 0x49,\r
137 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d,\r
138 0x2d, 0x0a,\r
139};\r
140\r
141//\r
142// Payload for PKCS#7 Signing & Verification Validation.\r
143//\r
144CONST CHAR8 *mEcPayload = "payload data for PKCS#7 EC Signing";\r
145\r
d97ee324
YL
146VOID *Ec1;\r
147VOID *Ec2;\r
148VOID *Group;\r
149VOID *Point1;\r
150VOID *Point2;\r
151VOID *PointRes;\r
152VOID *BnX;\r
153VOID *BnY;\r
154VOID *BnP;\r
155VOID *BnOrder;\r
156\r
157UNIT_TEST_STATUS\r
158EFIAPI\r
159TestVerifyEcPreReq (\r
160 UNIT_TEST_CONTEXT Context\r
161 )\r
162{\r
163 Ec1 = NULL;\r
164 Ec2 = NULL;\r
165 Group = NULL;\r
166 Point1 = NULL;\r
167 Point2 = NULL;\r
168 PointRes = NULL;\r
169 BnX = NULL;\r
170 BnY = NULL;\r
171 BnP = BigNumInit ();\r
172 BnOrder = BigNumInit ();\r
173 if ((BnP == NULL) || (BnOrder == NULL)) {\r
174 return UNIT_TEST_ERROR_TEST_FAILED;\r
175 }\r
176\r
177 return UNIT_TEST_PASSED;\r
178}\r
179\r
180VOID\r
181EFIAPI\r
182TestVerifyEcCleanUp (\r
183 UNIT_TEST_CONTEXT Context\r
184 )\r
185{\r
186 BigNumFree (BnX, TRUE);\r
187 BigNumFree (BnY, TRUE);\r
188 BigNumFree (BnP, TRUE);\r
189 BigNumFree (BnOrder, TRUE);\r
190 EcGroupFree (Group);\r
191 EcPointDeInit (Point1, TRUE);\r
192 EcPointDeInit (Point2, TRUE);\r
193 EcPointDeInit (PointRes, TRUE);\r
194 EcFree (Ec1);\r
195 EcFree (Ec2);\r
196}\r
197\r
198UNIT_TEST_STATUS\r
199EFIAPI\r
200TestVerifyEcBasic (\r
201 UNIT_TEST_CONTEXT Context\r
202 )\r
203{\r
204 UINTN CurveCount;\r
205 BOOLEAN Status;\r
206\r
207 //\r
208 // Initialize BigNumbers\r
209 //\r
210 for (CurveCount = 0; CurveCount < EC_CURVE_NUM_SUPPORTED; CurveCount++) {\r
211 //\r
212 // Basic EC functions unit test\r
213 //\r
214 Group = EcGroupInit (EcCurveList[CurveCount]);\r
215 if (Group == NULL) {\r
216 return UNIT_TEST_ERROR_TEST_FAILED;\r
217 }\r
218\r
219 Point1 = EcPointInit (Group);\r
220 Point2 = EcPointInit (Group);\r
221 PointRes = EcPointInit (Group);\r
222 BnX = BigNumFromBin (EcCurveGenerator[CurveCount].X, EcKeyHalfSize[CurveCount]);\r
223 BnY = BigNumFromBin (EcCurveGenerator[CurveCount].Y, EcKeyHalfSize[CurveCount]);\r
224 if ((Point1 == NULL) || (Point2 == NULL) || (PointRes == NULL) || (BnX == NULL) || (BnY == NULL)) {\r
225 return UNIT_TEST_ERROR_TEST_FAILED;\r
226 }\r
227\r
228 Status = EcGroupGetCurve (Group, BnP, NULL, NULL, NULL);\r
229 UT_ASSERT_TRUE (Status);\r
230\r
231 Status = EcGroupGetOrder (Group, BnOrder);\r
232 UT_ASSERT_TRUE (Status);\r
233\r
234 // Point G should on curve\r
235 Status = EcPointSetAffineCoordinates (Group, Point1, BnX, BnY, NULL);\r
236 UT_ASSERT_TRUE (Status);\r
237\r
238 Status = EcPointSetAffineCoordinates (Group, Point2, BnX, BnY, NULL);\r
239 UT_ASSERT_TRUE (Status);\r
240\r
241 Status = EcPointEqual (Group, Point1, Point2, NULL);\r
242 UT_ASSERT_TRUE (Status);\r
243\r
244 Status = EcPointIsOnCurve (Group, Point1, NULL);\r
245 UT_ASSERT_TRUE (Status);\r
246\r
247 Status = EcPointIsAtInfinity (Group, Point1);\r
248 UT_ASSERT_FALSE (Status);\r
249\r
250 // Point 2G should on curve\r
251 Status = EcPointAdd (Group, PointRes, Point1, Point1, NULL);\r
252 UT_ASSERT_TRUE (Status);\r
253\r
254 Status = EcPointIsOnCurve (Group, PointRes, NULL);\r
255 UT_ASSERT_TRUE (Status);\r
256\r
257 // Point Order * G should at infinity\r
258 Status = EcPointMul (Group, PointRes, Point1, BnOrder, NULL);\r
259 UT_ASSERT_TRUE (Status);\r
260\r
261 Status = EcPointIsAtInfinity (Group, PointRes);\r
262 UT_ASSERT_TRUE (Status);\r
263\r
264 // -(-G) == G\r
265 Status = EcPointInvert (Group, Point2, NULL);\r
266 UT_ASSERT_TRUE (Status);\r
267\r
268 Status = EcPointEqual (Group, Point2, Point1, NULL);\r
269 UT_ASSERT_FALSE (Status);\r
270\r
271 Status = EcPointInvert (Group, Point2, NULL);\r
272 UT_ASSERT_TRUE (Status);\r
273\r
274 Status = EcPointEqual (Group, Point2, Point1, NULL);\r
275 UT_ASSERT_TRUE (Status);\r
276\r
277 // Compress point test\r
278 Status = EcPointSetCompressedCoordinates (Group, Point1, BnX, 0, NULL);\r
279 UT_ASSERT_TRUE (Status);\r
280\r
281 Status = EcPointSetCompressedCoordinates (Group, Point2, BnX, 1, NULL);\r
282 UT_ASSERT_TRUE (Status);\r
283\r
284 Status = EcPointEqual (Group, Point2, Point1, NULL);\r
285 UT_ASSERT_FALSE (Status);\r
286\r
287 Status = EcPointInvert (Group, Point2, NULL);\r
288 UT_ASSERT_TRUE (Status);\r
289\r
290 Status = EcPointEqual (Group, Point2, Point1, NULL);\r
291 UT_ASSERT_TRUE (Status);\r
292 }\r
293\r
294 return UNIT_TEST_PASSED;\r
295}\r
296\r
297UNIT_TEST_STATUS\r
298EFIAPI\r
299TestVerifyEcDh (\r
300 UNIT_TEST_CONTEXT Context\r
301 )\r
302{\r
303 UINT8 Public1[66 * 2];\r
304 UINTN Public1Length;\r
305 UINT8 Public2[66 * 2];\r
306 UINTN Public2Length;\r
307 UINT8 Key1[66];\r
308 UINTN Key1Length;\r
309 UINT8 Key2[66];\r
310 UINTN Key2Length;\r
311 UINTN CurveCount;\r
312 BOOLEAN Status;\r
313\r
314 for (CurveCount = 0; CurveCount < EC_CURVE_NUM_SUPPORTED; CurveCount++) {\r
315 //\r
316 // Initial key length\r
317 //\r
318 Public1Length = sizeof (Public1);\r
319 Public2Length = sizeof (Public2);\r
320 Key1Length = sizeof (Key1);\r
321 Key2Length = sizeof (Key2);\r
322 //\r
323 // ECDH functions unit test\r
324 //\r
325 Ec1 = EcNewByNid (EcCurveList[CurveCount]);\r
326 if (Ec1 == NULL) {\r
327 return UNIT_TEST_ERROR_TEST_FAILED;\r
328 }\r
329\r
330 Ec2 = EcNewByNid (EcCurveList[CurveCount]);\r
331 if (Ec2 == NULL) {\r
332 return UNIT_TEST_ERROR_TEST_FAILED;\r
333 }\r
334\r
335 Status = EcGenerateKey (Ec1, Public1, &Public1Length);\r
336 UT_ASSERT_TRUE (Status);\r
337 UT_ASSERT_EQUAL (Public1Length, EcKeyHalfSize[CurveCount] * 2);\r
338\r
339 Status = EcGenerateKey (Ec2, Public2, &Public2Length);\r
340 UT_ASSERT_TRUE (Status);\r
341 UT_ASSERT_EQUAL (Public2Length, EcKeyHalfSize[CurveCount] * 2);\r
342\r
343 Status = EcDhComputeKey (Ec1, Public2, Public2Length, NULL, Key1, &Key1Length);\r
344 UT_ASSERT_TRUE (Status);\r
345 UT_ASSERT_EQUAL (Key1Length, EcKeyHalfSize[CurveCount]);\r
346\r
347 Status = EcDhComputeKey (Ec2, Public1, Public1Length, NULL, Key2, &Key2Length);\r
348 UT_ASSERT_TRUE (Status);\r
349 UT_ASSERT_EQUAL (Key2Length, EcKeyHalfSize[CurveCount]);\r
350\r
351 UT_ASSERT_EQUAL (Key1Length, Key2Length);\r
352 UT_ASSERT_MEM_EQUAL (Key1, Key2, Key1Length);\r
353\r
354 Status = EcGetPubKey (Ec1, Public2, &Public2Length);\r
355 UT_ASSERT_TRUE (Status);\r
356 UT_ASSERT_EQUAL (Public2Length, EcKeyHalfSize[CurveCount] * 2);\r
357\r
358 UT_ASSERT_EQUAL (Public1Length, Public2Length);\r
359 UT_ASSERT_MEM_EQUAL (Public1, Public2, Public1Length);\r
360 }\r
361\r
362 return UNIT_TEST_PASSED;\r
363}\r
364\r
03710322
QZ
365UNIT_TEST_STATUS\r
366EFIAPI\r
367TestVerifyEcKey (\r
368 UNIT_TEST_CONTEXT Context\r
369 )\r
370{\r
371 BOOLEAN Status;\r
372 VOID *EcPrivKey;\r
373 VOID *EcPubKey;\r
374 UINT8 HashValue[SHA256_DIGEST_SIZE];\r
375 UINTN HashSize;\r
376 UINT8 Signature[66 * 2];\r
377 UINTN SigSize;\r
378\r
379 //\r
380 // Retrieve EC private key from PEM data.\r
381 //\r
382 Status = EcGetPrivateKeyFromPem (\r
383 mEccTestPemKey,\r
384 sizeof (mEccTestPemKey),\r
385 NULL,\r
386 &EcPrivKey\r
387 );\r
388 UT_ASSERT_TRUE (Status);\r
389\r
390 //\r
391 // Retrieve EC public key from X509 Certificate.\r
392 //\r
393 Status = EcGetPublicKeyFromX509 (\r
394 mEccTestRootCer,\r
395 sizeof (mEccTestRootCer),\r
396 &EcPubKey\r
397 );\r
398 UT_ASSERT_TRUE (Status);\r
399\r
400 //\r
401 // Verify EC-DSA\r
402 //\r
403 HashSize = sizeof (HashValue);\r
404 SigSize = sizeof (Signature);\r
405 //\r
406 // EC-DSA Signing ...\r
407 //\r
408 Status = EcDsaSign (\r
409 EcPrivKey,\r
410 CRYPTO_NID_SHA256,\r
411 HashValue,\r
412 HashSize,\r
413 Signature,\r
414 &SigSize\r
415 );\r
416 UT_ASSERT_TRUE (Status);\r
417\r
418 //\r
419 // EC-DSA Verification ...\r
420 //\r
421 Status = EcDsaVerify (\r
422 EcPubKey,\r
423 CRYPTO_NID_SHA256,\r
424 HashValue,\r
425 HashSize,\r
426 Signature,\r
427 SigSize\r
428 );\r
429 UT_ASSERT_TRUE (Status);\r
430\r
431 EcFree (EcPrivKey);\r
432 EcFree (EcPubKey);\r
433\r
434 return UNIT_TEST_PASSED;\r
435}\r
436\r
d97ee324
YL
437TEST_DESC mEcTest[] = {\r
438 //\r
439 // -----Description-----------------Class------------------Function----Pre----Post----Context\r
440 //\r
441 { "TestVerifyEcBasic()", "CryptoPkg.BaseCryptLib.Ec", TestVerifyEcBasic, TestVerifyEcPreReq, TestVerifyEcCleanUp, NULL },\r
442 { "TestVerifyEcDh()", "CryptoPkg.BaseCryptLib.Ec", TestVerifyEcDh, TestVerifyEcPreReq, TestVerifyEcCleanUp, NULL },\r
03710322 443 { "TestVerifyEcKey()", "CryptoPkg.BaseCryptLib.Ec", TestVerifyEcKey, NULL, NULL, NULL },\r
d97ee324
YL
444};\r
445\r
446UINTN mEcTestNum = ARRAY_SIZE (mEcTest);\r