2 Application for Block Cipher Primitives Validation.
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 // TDES test vectors are extracted from OpenSSL 0.9.8l, crypto\des\destest.c
20 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbData
[] = {
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbKey
[] = {
25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
29 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbCipher
[] = {
30 0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7,
33 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcb2Cipher
[] = {
34 0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E,
37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcData
[] = {
38 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
39 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
40 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20
43 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcKey
[] = {
44 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
45 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
46 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
49 GLOBAL_REMOVE_IF_UNREFERENCED UINT8 TdesCbcIvec
[] = {
50 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
53 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbc3Cipher
[] = {
54 0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
55 0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
56 0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4
60 // AES test vectors are from NIST KAT of AES
62 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbData
[] = {
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
66 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbKey
[] = {
67 0x10, 0xa5, 0x88, 0x69, 0xd7, 0x4b, 0xe5, 0xa3, 0x74, 0xcf, 0x86, 0x7c, 0xfb, 0x47, 0x38, 0x59
70 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbCipher
[] = {
71 0x6d, 0x25, 0x1e, 0x69, 0x44, 0xb0, 0x51, 0xe0, 0x4e, 0xaa, 0x6f, 0xb4, 0xdb, 0xf7, 0x84, 0x65
74 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbData
[] = {
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
78 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbKey
[] = {
79 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
83 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbCipher
[] = {
84 0xdd, 0x8a, 0x49, 0x35, 0x14, 0x23, 0x1c, 0xbf, 0x56, 0xec, 0xce, 0xe4, 0xc4, 0x08, 0x89, 0xfb
87 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbData
[] = {
88 0x01, 0x47, 0x30, 0xf8, 0x0a, 0xc6, 0x25, 0xfe, 0x84, 0xf0, 0x26, 0xc6, 0x0b, 0xfd, 0x54, 0x7d
91 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbKey
[] = {
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
96 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbCipher
[] = {
97 0x5c, 0x9d, 0x84, 0x4e, 0xd4, 0x6f, 0x98, 0x85, 0x08, 0x5e, 0x5d, 0x6a, 0x4f, 0x94, 0xc7, 0xd7
100 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcData
[] = {
101 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
105 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcKey
[] = {
106 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0, 0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a
109 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcIvec
[] = {
110 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58
113 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcCipher
[] = {
114 0xd2, 0x96, 0xcd, 0x94, 0xc2, 0xcc, 0xcf, 0x8a, 0x3a, 0x86, 0x30, 0x28, 0xb5, 0xe1, 0xdc, 0x0a,
115 0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9, 0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1
119 // ARC4 Test Vector defined in "Appendix A.1 Test Vectors from [CRYPTLIB]" of
120 // IETF Draft draft-kaukonen-cipher-arcfour-03 ("A Stream Cipher Encryption Algorithm 'Arcfour'").
122 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Data
[] = {
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
126 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Key
[] = {
127 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
130 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Cipher
[] = {
131 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79
135 Validate UEFI-OpenSSL Block Ciphers (Symmetric Crypto) Interfaces.
137 @retval EFI_SUCCESS Validation succeeded.
138 @retval EFI_ABORTED Validation failed.
142 ValidateCryptBlockCipher (
152 Print (L
"\nUEFI-OpenSSL Block Cipher Engine Testing: ");
154 CtxSize
= TdesGetContextSize ();
155 CipherCtx
= AllocatePool (CtxSize
);
157 Print (L
"\n- TDES Validation: ");
163 // TDES ECB Validation
165 ZeroMem (Encrypt
, sizeof (Encrypt
));
166 ZeroMem (Decrypt
, sizeof (Decrypt
));
168 Status
= TdesInit (CipherCtx
, TdesEcbKey
, 64);
174 Status
= TdesEcbEncrypt (CipherCtx
, TdesEcbData
, 8, Encrypt
);
180 Status
= TdesEcbDecrypt (CipherCtx
, Encrypt
, 8, Decrypt
);
186 if (CompareMem (Encrypt
, TdesEcbCipher
, 8) != 0) {
191 if (CompareMem (Decrypt
, TdesEcbData
, 8) != 0) {
196 Print (L
"EDE2 ECB... ");
199 // TDES EDE2 ECB Validation
201 ZeroMem (Encrypt
, sizeof (Encrypt
));
202 ZeroMem (Decrypt
, sizeof (Decrypt
));
204 Status
= TdesInit (CipherCtx
, TdesEcbKey
, 128);
210 Status
= TdesEcbEncrypt (CipherCtx
, TdesEcbData
, 8, Encrypt
);
216 Status
= TdesEcbDecrypt (CipherCtx
, Encrypt
, 8, Decrypt
);
222 if (CompareMem (Encrypt
, TdesEcb2Cipher
, 8) != 0) {
227 if (CompareMem (Decrypt
, TdesEcbData
, 8) != 0) {
232 Print (L
"EDE3 CBC... ");
235 // TDES EDE3 CBC Validation
237 ZeroMem (Encrypt
, 256);
238 ZeroMem (Decrypt
, 256);
240 Status
= TdesInit (CipherCtx
, TdesCbcKey
, 192);
246 Status
= TdesCbcEncrypt (CipherCtx
, TdesCbcData
, sizeof (TdesCbcData
), TdesCbcIvec
, Encrypt
);
252 Status
= TdesCbcDecrypt (CipherCtx
, Encrypt
, sizeof (TdesCbcData
), TdesCbcIvec
, Decrypt
);
258 if (CompareMem (Encrypt
, TdesCbc3Cipher
, sizeof (TdesCbc3Cipher
)) != 0) {
263 if (CompareMem (Decrypt
, TdesCbcData
, sizeof (TdesCbcData
)) != 0) {
270 FreePool (CipherCtx
);
272 CtxSize
= AesGetContextSize ();
273 CipherCtx
= AllocatePool (CtxSize
);
275 Print (L
"\n- AES Validation: ");
277 Print (L
"ECB-128... ");
280 // AES-128 ECB Validation
282 ZeroMem (Encrypt
, sizeof (Encrypt
));
283 ZeroMem (Decrypt
, sizeof (Decrypt
));
285 Status
= AesInit (CipherCtx
, Aes128EcbKey
, 128);
291 Status
= AesEcbEncrypt (CipherCtx
, Aes128EcbData
, sizeof (Aes128EcbData
), Encrypt
);
297 Status
= AesEcbDecrypt (CipherCtx
, Encrypt
, sizeof (Aes128EcbData
), Decrypt
);
303 if (CompareMem (Encrypt
, Aes128EcbCipher
, sizeof (Aes128EcbCipher
)) != 0) {
308 if (CompareMem (Decrypt
, Aes128EcbData
, sizeof (Aes128EcbData
)) != 0) {
313 Print (L
"ECB-192... ");
316 // AES-192 ECB Validation
318 ZeroMem (Encrypt
, sizeof (Encrypt
));
319 ZeroMem (Decrypt
, sizeof (Decrypt
));
321 Status
= AesInit (CipherCtx
, Aes192EcbKey
, 192);
327 Status
= AesEcbEncrypt (CipherCtx
, Aes192EcbData
, sizeof (Aes192EcbData
), Encrypt
);
333 Status
= AesEcbDecrypt (CipherCtx
, Encrypt
, sizeof (Aes192EcbData
), Decrypt
);
339 if (CompareMem (Encrypt
, Aes192EcbCipher
, sizeof (Aes192EcbCipher
)) != 0) {
344 if (CompareMem (Decrypt
, Aes192EcbData
, sizeof (Aes192EcbData
)) != 0) {
349 Print (L
"ECB-256... ");
352 // AES-256 ECB Validation
354 ZeroMem (Encrypt
, sizeof (Encrypt
));
355 ZeroMem (Decrypt
, sizeof (Decrypt
));
357 Status
= AesInit (CipherCtx
, Aes256EcbKey
, 256);
363 Status
= AesEcbEncrypt (CipherCtx
, Aes256EcbData
, sizeof (Aes256EcbData
), Encrypt
);
369 Status
= AesEcbDecrypt (CipherCtx
, Encrypt
, sizeof (Aes256EcbData
), Decrypt
);
375 if (CompareMem (Encrypt
, Aes256EcbCipher
, sizeof (Aes256EcbCipher
)) != 0) {
380 if (CompareMem (Decrypt
, Aes256EcbData
, sizeof (Aes256EcbData
)) != 0) {
385 Print (L
"CBC-128... ");
388 // AES-128 CBC Validation
390 ZeroMem (Encrypt
, sizeof (Encrypt
));
391 ZeroMem (Decrypt
, sizeof (Decrypt
));
393 Status
= AesInit (CipherCtx
, Aes128CbcKey
, 128);
399 Status
= AesCbcEncrypt (CipherCtx
, Aes128CbcData
, sizeof (Aes128CbcData
), Aes128CbcIvec
, Encrypt
);
405 Status
= AesCbcDecrypt (CipherCtx
, Encrypt
, sizeof (Aes128CbcData
), Aes128CbcIvec
, Decrypt
);
411 if (CompareMem (Encrypt
, Aes128CbcCipher
, sizeof (Aes128CbcCipher
)) != 0) {
416 if (CompareMem (Decrypt
, Aes128CbcData
, sizeof (Aes128CbcData
)) != 0) {
423 Print (L
"\n- ARC4 Validation: ");
428 CtxSize
= Arc4GetContextSize ();
429 CipherCtx
= AllocatePool (CtxSize
);
431 ZeroMem (Encrypt
, sizeof (Encrypt
));
432 ZeroMem (Decrypt
, sizeof (Decrypt
));
434 Status
= Arc4Init (CipherCtx
, Arc4Key
, sizeof (Arc4Key
));
440 Status
= Arc4Encrypt (CipherCtx
, Arc4Data
, sizeof (Arc4Data
), Encrypt
);
446 Status
= Arc4Reset (CipherCtx
);
452 Status
= Arc4Decrypt (CipherCtx
, Encrypt
, sizeof (Arc4Data
), Decrypt
);
458 if (CompareMem (Encrypt
, Arc4Cipher
, sizeof (Arc4Cipher
)) != 0) {
463 if (CompareMem (Decrypt
, Arc4Data
, sizeof (Arc4Data
)) != 0) {