1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** NetX Secure Component */
16 /** */
17 /** Transport Layer Security (TLS) */
18 /** */
19 /**************************************************************************/
20 /**************************************************************************/
21
22 #define NX_SECURE_SOURCE_CODE
23
24
25 /* Include necessary system files. */
26
27 #include "nx_secure_crypto_table_self_test.h"
28
29
30 #ifdef NX_SECURE_POWER_ON_SELF_TEST_MODULE_INTEGRITY_CHECK
31
32 #define INPUT_OUTPUT_LENGTH (16)
33
34 /* A42E843B22E6CC7C09AD783FACE7F251 */
35 static const UCHAR key_cbc_128[] = {
36 0xA4, 0x2E, 0x84, 0x3B, 0x22, 0xE6, 0xCC, 0x7C, 0x09, 0xAD, 0x78, 0x3F, 0xAC, 0xE7, 0xF2, 0x51,
37 };
38
39 /* 87BFAE15B37B90751B426240F5BC0C16 */
40 static const UCHAR iv_cbc_128[] = {
41 0x87, 0xBF, 0xAE, 0x15, 0xB3, 0x7B, 0x90, 0x75, 0x1B, 0x42, 0x62, 0x40, 0xF5, 0xBC, 0x0C, 0x16,
42 };
43
44 /* 997F8E2A478FF2479A83B90BD44EDE5C */
45 static const UCHAR plain_cbc_128[] = {
46 0x99, 0x7F, 0x8E, 0x2A, 0x47, 0x8F, 0xF2, 0x47, 0x9A, 0x83, 0xB9, 0x0B, 0xD4, 0x4E, 0xDE, 0x5C,
47 };
48
49 /* 24E38770FF9397AFA5A5F7F0689610EF */
50 static const UCHAR secret_cbc_128[] = {
51 0x24, 0xE3, 0x87, 0x70, 0xFF, 0x93, 0x97, 0xAF, 0xA5, 0xA5, 0xF7, 0xF0, 0x68, 0x96, 0x10, 0xEF,
52 };
53
54 /* DCF688403AB1C0079D3FCC1B046398675FAF971E50A92525 */
55 static const UCHAR key_cbc_192[] = {
56 0xDC, 0xF6, 0x88, 0x40, 0x3A, 0xB1, 0xC0, 0x07, 0x9D, 0x3F, 0xCC, 0x1B, 0x04, 0x63, 0x98, 0x67,
57 0x5F, 0xAF, 0x97, 0x1E, 0x50, 0xA9, 0x25, 0x25, };
58
59 /* 78E45F7E3868534D38B45B7E8F549243 */
60 static const UCHAR iv_cbc_192[] = {
61 0x78, 0xE4, 0x5F, 0x7E, 0x38, 0x68, 0x53, 0x4D, 0x38, 0xB4, 0x5B, 0x7E, 0x8F, 0x54, 0x92, 0x43,
62 };
63
64 /* 178BB520EBE2D330539EB315A5EDE75B */
65 static const UCHAR plain_cbc_192[] = {
66 0x17, 0x8B, 0xB5, 0x20, 0xEB, 0xE2, 0xD3, 0x30, 0x53, 0x9E, 0xB3, 0x15, 0xA5, 0xED, 0xE7, 0x5B,
67 };
68
69 /* 58266726FD6E7E9FA64501681B73FE88 */
70 static const UCHAR secret_cbc_192[] = {
71 0x58, 0x26, 0x67, 0x26, 0xFD, 0x6E, 0x7E, 0x9F, 0xA6, 0x45, 0x01, 0x68, 0x1B, 0x73, 0xFE, 0x88,
72 };
73
74 static const UCHAR key_cbc_256[] = {
75 0x02, 0xCF, 0x1E, 0x1D, 0x97, 0x96, 0xAD, 0x33, 0x95, 0xD8, 0x12, 0x67, 0x57, 0xB6, 0xFC, 0x7C,
76 0x70, 0x5F, 0x08, 0x2F, 0xB8, 0x52, 0x70, 0x42, 0x77, 0x60, 0xAC, 0x17, 0x37, 0x59, 0xCE, 0x07,
77 };
78
79 /* BB35190002242F28FC79C01B89022604 */
80 static const UCHAR iv_cbc_256[] = {
81 0xBB, 0x35, 0x19, 0x00, 0x02, 0x24, 0x2F, 0x28, 0xFC, 0x79, 0xC0, 0x1B, 0x89, 0x02, 0x26, 0x04,
82 };
83
84 /* 05D4EE7191E69A0AC7CBC1625258085D */
85 static const UCHAR plain_cbc_256[] = {
86 0x05, 0xD4, 0xEE, 0x71, 0x91, 0xE6, 0x9A, 0x0A, 0xC7, 0xCB, 0xC1, 0x62, 0x52, 0x58, 0x08, 0x5D,
87 };
88
89 /* F65F0278E9F5D525F66DC5AFAD99F205 */
90 static const UCHAR secret_cbc_256[] = {
91 0xF6, 0x5F, 0x02, 0x78, 0xE9, 0xF5, 0xD5, 0x25, 0xF6, 0x6D, 0xC5, 0xAF, 0xAD, 0x99, 0xF2, 0x05,
92 };
93
94
95 /*Note: For CTR, the key_ctr_128, key_ctr_192 and key_ctr_256 is the conjunction of key and nonce. */
96 /* 3982F50DA5D5D9587EE8FD7078F2BB309C19BD6C */
97 static const UCHAR key_ctr_128[] = {
98 0x39, 0x82, 0xF5, 0x0D, 0xA5, 0xD5, 0xD9, 0x58, 0x7E, 0xE8, 0xFD, 0x70, 0x78, 0xF2, 0xBB, 0x30,
99 0x9C, 0x19, 0xBD, 0x6C,
100 };
101
102 /* C3834608D6198033 */
103 static const UCHAR iv_ctr_128[] = {
104 0xC3, 0x83, 0x46, 0x08, 0xD6, 0x19, 0x80, 0x33,
105 };
106
107 /* 8854117807D40A6837520939CA38FA2A */
108 static const UCHAR plain_ctr_128[] = {
109 0x88, 0x54, 0x11, 0x78, 0x07, 0xD4, 0x0A, 0x68, 0x37, 0x52, 0x09, 0x39, 0xCA, 0x38, 0xFA, 0x2A,
110 };
111
112 /* 33B8C6FF1ED6A85B4E29AB6585869FEE */
113 static const UCHAR secret_ctr_128[] = {
114 0x33, 0xB8, 0xC6, 0xFF, 0x1E, 0xD6, 0xA8, 0x5B, 0x4E, 0x29, 0xAB, 0x65, 0x85, 0x86, 0x9F, 0xEE,
115 };
116
117 /* AE5DB35787511A77E554FF2258E1A15D62CB7F416E8BDA223E25646D */
118 static const UCHAR key_ctr_192[] = {
119 0xAE, 0x5D, 0xB3, 0x57, 0x87, 0x51, 0x1A, 0x77, 0xE5, 0x54, 0xFF, 0x22, 0x58, 0xE1, 0xA1, 0x5D,
120 0x62, 0xCB, 0x7F, 0x41, 0x6E, 0x8B, 0xDA, 0x22, 0x3E, 0x25, 0x64, 0x6D, };
121
122 /* 0C3605005954FF2A */
123 static const UCHAR iv_ctr_192[] = {
124 0x0C, 0x36, 0x05, 0x00, 0x59, 0x54, 0xFF, 0x2A,
125 };
126
127 /* BB924D2DDE863F2C01F2A549C9D06444 */
128 static const UCHAR plain_ctr_192[] = {
129 0xBB, 0x92, 0x4D, 0x2D, 0xDE, 0x86, 0x3F, 0x2C, 0x01, 0xF2, 0xA5, 0x49, 0xC9, 0xD0, 0x64, 0x44,
130 };
131
132 /* ED988DC30B5C6394D21A3F2477836FBB */
133 static const UCHAR secret_ctr_192[] = {
134 0xED, 0x98, 0x8D, 0xC3, 0x0B, 0x5C, 0x63, 0x94, 0xD2, 0x1A, 0x3F, 0x24, 0x77, 0x83, 0x6F, 0xBB,
135 };
136
137 /* D0E78C4D0B30D33F5BF4A132B2F94A4A38963511A3904B117E35A37B5AAC8A193BF0D158 */
138 static const UCHAR key_ctr_256[] = {
139 0xD0, 0xE7, 0x8C, 0x4D, 0x0B, 0x30, 0xD3, 0x3F, 0x5B, 0xF4, 0xA1, 0x32, 0xB2, 0xF9, 0x4A, 0x4A,
140 0x38, 0x96, 0x35, 0x11, 0xA3, 0x90, 0x4B, 0x11, 0x7E, 0x35, 0xA3, 0x7B, 0x5A, 0xAC, 0x8A, 0x19,
141 0x3B, 0xF0, 0xD1, 0x58,
142 };
143
144 /* A1A31704C8B7E16C */
145 static const UCHAR iv_ctr_256[] = {
146 0xA1, 0xA3, 0x17, 0x04, 0xC8, 0xB7, 0xE1, 0x6C,
147 };
148
149 /* 981FA33222C5451017530155A4BF7F29 */
150 static const UCHAR plain_ctr_256[] = {
151 0x98, 0x1F, 0xA3, 0x32, 0x22, 0xC5, 0x45, 0x10, 0x17, 0x53, 0x01, 0x55, 0xA4, 0xBF, 0x7F, 0x29,
152 };
153
154 /* 643B91B4E541B20AAAEAB77F2D328566 */
155 static const UCHAR secret_ctr_256[] = {
156 0x64, 0x3B, 0x91, 0xB4, 0xE5, 0x41, 0xB2, 0x0A, 0xAA, 0xEA, 0xB7, 0x7F, 0x2D, 0x32, 0x85, 0x66,
157 };
158
159 /* 83F9D97D4AB759FDDCC3EF54A0E2A8EC */
160 static const UCHAR key_gcm_128[] = {
161 0x83, 0xF9, 0xD9, 0x7D, 0x4A, 0xB7, 0x59, 0xFD, 0xDC, 0xC3, 0xEF, 0x54, 0xA0, 0xE2, 0xA8, 0xEC,
162 };
163
164 /* 01CF */
165 static const UCHAR iv_gcm_128[] = {
166 0x01, 0xCF,
167 };
168
169 /* 77E6329CF9424F71C808DF9170BFD298 */
170 static const UCHAR plain_gcm_128[] = {
171 0x77, 0xE6, 0x32, 0x9C, 0xF9, 0x42, 0x4F, 0x71, 0xC8, 0x08, 0xDF, 0x91, 0x70, 0xBF, 0xD2, 0x98,
172 };
173
174 /* 6DD49EAEB4103DAC8F97E3234946DD2D */
175 static const UCHAR aad_gcm_128[] = {
176 0x6D, 0xD4, 0x9E, 0xAE, 0xB4, 0x10, 0x3D, 0xAC, 0x8F, 0x97, 0xE3, 0x23, 0x49, 0x46, 0xDD, 0x2D,
177 };
178
179 /* 50DE86A7A92A8A5EA33DB5696B96CD77AA181E84BC8B4BF5A68927C409D422CB */
180 static const UCHAR secret_gcm_128[] = {
181 0x50, 0xDE, 0x86, 0xA7, 0xA9, 0x2A, 0x8A, 0x5E, 0xA3, 0x3D, 0xB5, 0x69, 0x6B, 0x96, 0xCD, 0x77,
182 0xAA, 0x18, 0x1E, 0x84, 0xBC, 0x8B, 0x4B, 0xF5, 0xA6, 0x89, 0x27, 0xC4, 0x09, 0xD4, 0x22, 0xCB
183 };
184
185 static UCHAR output[INPUT_OUTPUT_LENGTH * 2];
186
187 /**************************************************************************/
188 /* */
189 /* FUNCTION RELEASE */
190 /* */
191 /* nx_secure_crypto_method_self_test_aes PORTABLE C */
192 /* 6.1 */
193 /* AUTHOR */
194 /* */
195 /* Timothy Stapko, Microsoft Corporation */
196 /* */
197 /* DESCRIPTION */
198 /* */
199 /* This function performs the Known Answer Test for AES crypto method. */
200 /* */
201 /* INPUT */
202 /* */
203 /* method_ptr Pointer to the crypto method */
204 /* to be tested. */
205 /* */
206 /* OUTPUT */
207 /* */
208 /* status Completion status */
209 /* */
210 /* CALLS */
211 /* */
212 /* None */
213 /* */
214 /* CALLED BY */
215 /* */
216 /* Application Code */
217 /* */
218 /* RELEASE HISTORY */
219 /* */
220 /* DATE NAME DESCRIPTION */
221 /* */
222 /* 05-19-2020 Timothy Stapko Initial Version 6.0 */
223 /* 09-30-2020 Timothy Stapko Modified comment(s), */
224 /* resulting in version 6.1 */
225 /* */
226 /**************************************************************************/
_nx_secure_crypto_method_self_test_aes(NX_CRYPTO_METHOD * crypto_method_aes,VOID * metadata,UINT metadata_size)227 UINT _nx_secure_crypto_method_self_test_aes(NX_CRYPTO_METHOD *crypto_method_aes,
228 VOID *metadata, UINT metadata_size)
229 {
230 UCHAR *key;
231 UCHAR *iv;
232 UCHAR *plain;
233 UCHAR *secret;
234 UCHAR *aad = NX_NULL;
235 UINT key_size;
236 UINT secret_size = INPUT_OUTPUT_LENGTH;
237 UINT status;
238 VOID *handler = NX_NULL;
239
240
241 /* Validate the crypto method */
242 if(crypto_method_aes == NX_NULL)
243 return(NX_PTR_ERROR);
244
245 key_size = crypto_method_aes -> nx_crypto_key_size_in_bits;
246
247 switch (crypto_method_aes -> nx_crypto_algorithm)
248 {
249 case NX_CRYPTO_ENCRYPTION_AES_CBC:
250 switch (key_size)
251 {
252 case 128:
253 key = (UCHAR *)key_cbc_128;
254 iv = (UCHAR *)iv_cbc_128;
255 plain = (UCHAR *)plain_cbc_128;
256 secret = (UCHAR *)secret_cbc_128;
257 break;
258 case 192:
259 key = (UCHAR *)key_cbc_192;
260 iv = (UCHAR *)iv_cbc_192;
261 plain = (UCHAR *)plain_cbc_192;
262 secret = (UCHAR *)secret_cbc_192;
263 break;
264 case 256:
265 key = (UCHAR *)key_cbc_256;
266 iv = (UCHAR *)iv_cbc_256;
267 plain = (UCHAR *)plain_cbc_256;
268 secret = (UCHAR *)secret_cbc_256;
269 break;
270 default:
271 return(1);
272 }
273 break;
274
275 case NX_CRYPTO_ENCRYPTION_AES_CTR:
276 switch (key_size)
277 {
278 case 128:
279 key = (UCHAR *)key_ctr_128;
280 iv = (UCHAR *)iv_ctr_128;
281 plain = (UCHAR *)plain_ctr_128;
282 secret = (UCHAR *)secret_ctr_128;
283 break;
284 case 192:
285 key = (UCHAR *)key_ctr_192;
286 iv = (UCHAR *)iv_ctr_192;
287 plain = (UCHAR *)plain_ctr_192;
288 secret = (UCHAR *)secret_ctr_192;
289 break;
290 case 256:
291 key = (UCHAR *)key_ctr_256;
292 iv = (UCHAR *)iv_ctr_256;
293 plain = (UCHAR *)plain_ctr_256;
294 secret = (UCHAR *)secret_ctr_256;
295 break;
296 default:
297 return(1);
298 }
299 break;
300
301 case NX_CRYPTO_ENCRYPTION_AES_GCM_16:
302 switch (key_size)
303 {
304 case 128:
305 key = (UCHAR *)key_gcm_128;
306 iv = (UCHAR *)iv_gcm_128;
307 plain = (UCHAR *)plain_gcm_128;
308 secret = (UCHAR *)secret_gcm_128;
309 aad = (UCHAR *)aad_gcm_128;
310 secret_size = sizeof(secret_gcm_128);
311 break;
312 default:
313 return(1);
314 }
315 break;
316
317 default:
318 return(1);
319 }
320
321 if (crypto_method_aes -> nx_crypto_init)
322 {
323 status = crypto_method_aes -> nx_crypto_init(crypto_method_aes,
324 key,
325 key_size,
326 &handler,
327 metadata,
328 metadata_size);
329 if (status != NX_CRYPTO_SUCCESS)
330 {
331 return(status);
332 }
333 }
334
335 if (crypto_method_aes -> nx_crypto_operation == NX_NULL)
336 {
337 return(NX_PTR_ERROR);
338 }
339
340 if (aad != NX_NULL)
341 {
342 /* Set additional data pointer and length. */
343 status = crypto_method_aes -> nx_crypto_operation(NX_CRYPTO_SET_ADDITIONAL_DATA,
344 NX_NULL,
345 crypto_method_aes,
346 key,
347 key_size,
348 aad,
349 INPUT_OUTPUT_LENGTH,
350 (UCHAR *)iv,
351 (UCHAR *)NX_NULL,
352 0,
353 metadata,
354 metadata_size,
355 NX_NULL, NX_NULL);
356 if (status != NX_CRYPTO_SUCCESS)
357 {
358 return(status);
359 }
360 }
361
362 /* Encryption. */
363 status = crypto_method_aes -> nx_crypto_operation(NX_CRYPTO_ENCRYPT,
364 handler,
365 crypto_method_aes,
366 key,
367 key_size,
368 plain,
369 INPUT_OUTPUT_LENGTH,
370 iv,
371 output,
372 secret_size,
373 metadata,
374 metadata_size,
375 NX_NULL, NX_NULL);
376 if (status != NX_CRYPTO_SUCCESS)
377 {
378 return(status);
379 }
380
381 if (NX_SECURE_MEMCMP(output, secret, secret_size) != 0)
382 {
383 return(NX_NOT_SUCCESSFUL);
384 }
385
386 /* Decryption. */
387 status = crypto_method_aes -> nx_crypto_operation(NX_CRYPTO_DECRYPT,
388 handler,
389 crypto_method_aes,
390 key,
391 key_size,
392 secret,
393 secret_size,
394 iv,
395 output,
396 INPUT_OUTPUT_LENGTH,
397 metadata,
398 metadata_size,
399 NX_NULL, NX_NULL);
400 if (status != NX_CRYPTO_SUCCESS)
401 {
402 return(status);
403 }
404
405 if (NX_SECURE_MEMCMP(output, plain, INPUT_OUTPUT_LENGTH) != 0)
406 {
407 return(NX_NOT_SUCCESSFUL);
408 }
409
410 if (crypto_method_aes -> nx_crypto_cleanup)
411 {
412 status = crypto_method_aes -> nx_crypto_cleanup(metadata);
413 }
414
415 return(status);
416 }
417 #endif
418
419
420