]>
Commit | Line | Data |
---|---|---|
d97ee324 YL |
1 | /** @file\r |
2 | Application for Diffie-Hellman Primitives Validation.\r | |
3 | \r | |
4 | Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r | |
5 | SPDX-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 | |
12 | UINTN EcCurveList[EC_CURVE_NUM_SUPPORTED] = { CRYPTO_NID_SECP256R1, CRYPTO_NID_SECP384R1, CRYPTO_NID_SECP521R1 };\r | |
13 | UINTN EcKeyHalfSize[EC_CURVE_NUM_SUPPORTED] = { 32, 48, 66 };\r | |
14 | \r | |
15 | struct Generator {\r | |
16 | UINT8 X[66];\r | |
17 | UINT8 Y[66];\r | |
18 | };\r | |
19 | \r | |
20 | // Generator points of all ec curve\r | |
21 | struct 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 | |
66 | GLOBAL_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 | |
112 | GLOBAL_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 | |
144 | CONST CHAR8 *mEcPayload = "payload data for PKCS#7 EC Signing";\r | |
145 | \r | |
d97ee324 YL |
146 | VOID *Ec1;\r |
147 | VOID *Ec2;\r | |
148 | VOID *Group;\r | |
149 | VOID *Point1;\r | |
150 | VOID *Point2;\r | |
151 | VOID *PointRes;\r | |
152 | VOID *BnX;\r | |
153 | VOID *BnY;\r | |
154 | VOID *BnP;\r | |
155 | VOID *BnOrder;\r | |
156 | \r | |
157 | UNIT_TEST_STATUS\r | |
158 | EFIAPI\r | |
159 | TestVerifyEcPreReq (\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 | |
180 | VOID\r | |
181 | EFIAPI\r | |
182 | TestVerifyEcCleanUp (\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 | |
198 | UNIT_TEST_STATUS\r | |
199 | EFIAPI\r | |
200 | TestVerifyEcBasic (\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 | |
297 | UNIT_TEST_STATUS\r | |
298 | EFIAPI\r | |
299 | TestVerifyEcDh (\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 |
365 | UNIT_TEST_STATUS\r |
366 | EFIAPI\r | |
367 | TestVerifyEcKey (\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 |
437 | TEST_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 | |
446 | UINTN mEcTestNum = ARRAY_SIZE (mEcTest);\r |