TianoCore EDK2 master
Loading...
Searching...
No Matches
BlockCipherTests.c
Go to the documentation of this file.
1
9#include "TestBaseCryptLib.h"
10
11//
12// TDES test vectors are extracted from OpenSSL 0.9.8l, crypto\des\destest.c
13//
14GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbData[] = {
15 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16};
17
18GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbKey[] = {
19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
21};
22
23GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbCipher[] = {
24 0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7,
25};
26
27GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcb2Cipher[] = {
28 0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E,
29};
30
31GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcData[] = {
32 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
33 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
34 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20
35};
36
37GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcKey[] = {
38 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
39 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
40 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
41};
42
43GLOBAL_REMOVE_IF_UNREFERENCED UINT8 TdesCbcIvec[] = {
44 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
45};
46
47GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbc3Cipher[] = {
48 0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,
49 0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,
50 0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4
51};
52
53//
54// AES test vectors are from NIST KAT of AES
55//
56GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbData[] = {
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
58};
59
60GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbKey[] = {
61 0x10, 0xa5, 0x88, 0x69, 0xd7, 0x4b, 0xe5, 0xa3, 0x74, 0xcf, 0x86, 0x7c, 0xfb, 0x47, 0x38, 0x59
62};
63
64GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbCipher[] = {
65 0x6d, 0x25, 0x1e, 0x69, 0x44, 0xb0, 0x51, 0xe0, 0x4e, 0xaa, 0x6f, 0xb4, 0xdb, 0xf7, 0x84, 0x65
66};
67
68GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbData[] = {
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
70};
71
72GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbKey[] = {
73 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
74 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
75};
76
77GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbCipher[] = {
78 0xdd, 0x8a, 0x49, 0x35, 0x14, 0x23, 0x1c, 0xbf, 0x56, 0xec, 0xce, 0xe4, 0xc4, 0x08, 0x89, 0xfb
79};
80
81GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbData[] = {
82 0x01, 0x47, 0x30, 0xf8, 0x0a, 0xc6, 0x25, 0xfe, 0x84, 0xf0, 0x26, 0xc6, 0x0b, 0xfd, 0x54, 0x7d
83};
84
85GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbKey[] = {
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
88};
89
90GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbCipher[] = {
91 0x5c, 0x9d, 0x84, 0x4e, 0xd4, 0x6f, 0x98, 0x85, 0x08, 0x5e, 0x5d, 0x6a, 0x4f, 0x94, 0xc7, 0xd7
92};
93
94GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcData[] = {
95 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
96 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
97};
98
99GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcKey[] = {
100 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0, 0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a
101};
102
103GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcIvec[] = {
104 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58
105};
106
107GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcCipher[] = {
108 0xd2, 0x96, 0xcd, 0x94, 0xc2, 0xcc, 0xcf, 0x8a, 0x3a, 0x86, 0x30, 0x28, 0xb5, 0xe1, 0xdc, 0x0a,
109 0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9, 0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1
110};
111
112//
113// ARC4 Test Vector defined in "Appendix A.1 Test Vectors from [CRYPTLIB]" of
114// IETF Draft draft-kaukonen-cipher-arcfour-03 ("A Stream Cipher Encryption Algorithm 'Arcfour'").
115//
116GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Data[] = {
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
118};
119
120GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Key[] = {
121 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
122};
123
124GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Cipher[] = {
125 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79
126};
127
128typedef
129UINTN
130(EFIAPI *EFI_BLOCK_CIPHER_GET_CONTEXT_SIZE)(
131 VOID
132 );
133
134typedef
135BOOLEAN
136(EFIAPI *EFI_BLOCK_CIPHER_INIT)(
137 OUT VOID *BlockCipherContext,
138 IN CONST UINT8 *Key,
139 IN UINTN KeyLength
140 );
141
142typedef
143BOOLEAN
144(EFIAPI *EFI_BLOCK_CIPHER_ECB_ENCRYPT_DECRYPT)(
145 IN VOID *BlockCipherContext,
146 IN CONST UINT8 *Input,
147 IN UINTN InputSize,
148 OUT UINT8 *Output
149 );
150
151typedef
152BOOLEAN
153(EFIAPI *EFI_BLOCK_CIPHER_CBC_ENCRYPT_DECRYPT)(
154 IN VOID *BlockCipherContext,
155 IN CONST UINT8 *Input,
156 IN UINTN InputSize,
157 IN CONST UINT8 *Ivec,
158 OUT UINT8 *Output
159 );
160
161typedef
162BOOLEAN
163(EFIAPI *EFI_BLOCK_CIPHER_RESET)(
164 IN OUT VOID *BlockCipherContext
165 );
166
167typedef struct {
168 EFI_BLOCK_CIPHER_GET_CONTEXT_SIZE GetContextSize;
169 EFI_BLOCK_CIPHER_INIT Init;
170 EFI_BLOCK_CIPHER_ECB_ENCRYPT_DECRYPT EcbEncrypt;
171 EFI_BLOCK_CIPHER_ECB_ENCRYPT_DECRYPT EcbDecrypt;
172 EFI_BLOCK_CIPHER_CBC_ENCRYPT_DECRYPT CbcEncrypt;
173 EFI_BLOCK_CIPHER_CBC_ENCRYPT_DECRYPT CbcDecrypt;
174 EFI_BLOCK_CIPHER_RESET Reset;
175 CONST UINT8 *Key;
176 UINTN KeySize;
177 CONST UINT8 *Ivec;
178 CONST UINT8 *Data;
179 UINTN DataSize;
180 CONST UINT8 *Cipher;
181 UINTN CipherSize;
182 VOID *Ctx;
184
185// These are commented out as they are deprecated, but are left in should they be used again
186// BLOCK_CIPHER_TEST_CONTEXT mTdesEcbTestCtx = {TdesGetContextSize, TdesInit, TdesEcbEncrypt, TdesEcbDecrypt, NULL, NULL, NULL, TdesEcbKey, 64, NULL, TdesEcbData, 8, TdesEcbCipher, 8};
187// BLOCK_CIPHER_TEST_CONTEXT mTdesCbcTestCtx = {TdesGetContextSize, TdesInit, NULL, NULL, TdesCbcEncrypt, TdesCbcDecrypt, NULL, TdesCbcKey, 192, TdesCbcIvec, TdesCbcData, sizeof(TdesCbcData), TdesCbc3Cipher, sizeof(TdesCbc3Cipher)};
188// BLOCK_CIPHER_TEST_CONTEXT mAes128EcbTestCtx = {AesGetContextSize, AesInit, AesEcbEncrypt, AesEcbDecrypt, NULL, NULL, NULL, Aes128EcbKey, 128, NULL, Aes128EcbData, sizeof(Aes128EcbData), Aes128EcbCipher, sizeof(Aes128EcbCipher)};
189// BLOCK_CIPHER_TEST_CONTEXT mAes192EcbTestCtx = {AesGetContextSize, AesInit, AesEcbEncrypt, AesEcbDecrypt, NULL, NULL, NULL, Aes192EcbKey, 192, NULL, Aes192EcbData, sizeof(Aes192EcbData), Aes192EcbCipher, sizeof(Aes192EcbCipher)};
190// BLOCK_CIPHER_TEST_CONTEXT mAes256EcbTestCtx = {AesGetContextSize, AesInit, AesEcbEncrypt, AesEcbDecrypt, NULL, NULL, NULL, Aes256EcbKey, 256, NULL, Aes256EcbData, sizeof(Aes256EcbData), Aes256EcbCipher, sizeof(Aes256EcbCipher)};
191// BLOCK_CIPHER_TEST_CONTEXT mArc4TestCtx = {Arc4GetContextSize, Arc4Init, Arc4Encrypt, (EFI_BLOCK_CIPHER_ECB_ENCRYPT_DECRYPT), Arc4Decrypt, NULL, NULL, Arc4Reset, Arc4Key, sizeof(Arc4Key), NULL, Arc4Data, sizeof(Arc4Data), Arc4Cipher, sizeof(Arc4Cipher)};
192BLOCK_CIPHER_TEST_CONTEXT mAes128CbcTestCtx = { AesGetContextSize, AesInit, NULL, NULL, AesCbcEncrypt, AesCbcDecrypt, NULL, Aes128CbcKey, 128, Aes128CbcIvec, Aes128CbcData, sizeof (Aes128CbcData), Aes128CbcCipher, sizeof (Aes128CbcCipher) };
193
195EFIAPI
196TestVerifyBLockCiperPreReq (
197 UNIT_TEST_CONTEXT Context
198 )
199{
200 BLOCK_CIPHER_TEST_CONTEXT *TestContext;
201 UINTN CtxSize;
202
203 TestContext = Context;
204 CtxSize = TestContext->GetContextSize ();
205 TestContext->Ctx = AllocatePool (CtxSize);
206 if (TestContext->Ctx == NULL) {
207 return UNIT_TEST_ERROR_TEST_FAILED;
208 }
209
210 return UNIT_TEST_PASSED;
211}
212
213VOID
214EFIAPI
215TestVerifyBLockCiperCleanUp (
216 UNIT_TEST_CONTEXT Context
217 )
218{
219 BLOCK_CIPHER_TEST_CONTEXT *TestContext;
220
221 TestContext = Context;
222 if (TestContext->Ctx != NULL) {
223 FreePool (TestContext->Ctx);
224 }
225}
226
228EFIAPI
229TestVerifyBLockCiper (
230 UNIT_TEST_CONTEXT Context
231 )
232{
233 UINT8 Encrypt[256];
234 UINT8 Decrypt[256];
235 BOOLEAN Status;
236 BLOCK_CIPHER_TEST_CONTEXT *TestContext;
237
238 TestContext = Context;
239
240 ZeroMem (Encrypt, sizeof (Encrypt));
241 ZeroMem (Decrypt, sizeof (Decrypt));
242
243 Status = TestContext->Init (TestContext->Ctx, TestContext->Key, TestContext->KeySize);
244 UT_ASSERT_TRUE (Status);
245
246 if (TestContext->Ivec == NULL) {
247 Status = TestContext->EcbEncrypt (TestContext->Ctx, TestContext->Data, TestContext->DataSize, Encrypt);
248 UT_ASSERT_TRUE (Status);
249
250 if (TestContext->Reset != NULL) {
251 Status = TestContext->Reset (TestContext->Ctx);
252 UT_ASSERT_TRUE (Status);
253 }
254
255 Status = TestContext->EcbDecrypt (TestContext->Ctx, Encrypt, TestContext->DataSize, Decrypt);
256 UT_ASSERT_TRUE (Status);
257 } else {
258 Status = TestContext->CbcEncrypt (TestContext->Ctx, TestContext->Data, TestContext->DataSize, TestContext->Ivec, Encrypt);
259 UT_ASSERT_TRUE (Status);
260
261 if (TestContext->Reset != NULL) {
262 Status = TestContext->Reset (TestContext->Ctx);
263 UT_ASSERT_TRUE (Status);
264 }
265
266 Status = TestContext->CbcDecrypt (TestContext->Ctx, Encrypt, TestContext->DataSize, TestContext->Ivec, Decrypt);
267 UT_ASSERT_TRUE (Status);
268 }
269
270 UT_ASSERT_MEM_EQUAL (Encrypt, TestContext->Cipher, TestContext->CipherSize);
271 UT_ASSERT_MEM_EQUAL (Decrypt, TestContext->Data, TestContext->DataSize);
272
273 return UNIT_TEST_PASSED;
274}
275
276TEST_DESC mBlockCipherTest[] = {
277 //
278 // -----Description-------------------------Class-------------------------Function---------------Pre---------------------------Post------------------Context
279 //
280 { "TestVerifyAes128Cbc()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mAes128CbcTestCtx },
281 // These are commented out as these functions have been deprecated, but they have been left in for future reference
282 // {"TestVerifyTdesEcb()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mTdesEcbTestCtx},
283 // {"TestVerifyTdesCbc()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mTdesCbcTestCtx},
284 // {"TestVerifyAes128Ecb()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mAes128EcbTestCtx},
285 // {"TestVerifyAes192Ecb()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mAes192EcbTestCtx},
286 // {"TestVerifyAes256Ecb()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mAes256EcbTestCtx},
287 // {"TestVerifyArc4()", "CryptoPkg.BaseCryptLib.BlockCipher", TestVerifyBLockCiper, TestVerifyBLockCiperPreReq, TestVerifyBLockCiperCleanUp, &mArc4TestCtx},
288};
289
290UINTN mBlockCipherTestNum = ARRAY_SIZE (mBlockCipherTest);
UINT64 UINTN
BOOLEAN EFIAPI AesInit(OUT VOID *AesContext, IN CONST UINT8 *Key, IN UINTN KeyLength)
Definition: CryptAes.c:53
UINTN EFIAPI AesGetContextSize(VOID)
Definition: CryptAes.c:20
BOOLEAN EFIAPI AesCbcEncrypt(IN VOID *AesContext, IN CONST UINT8 *Input, IN UINTN InputSize, IN CONST UINT8 *Ivec, OUT UINT8 *Output)
Definition: CryptAes.c:112
BOOLEAN EFIAPI AesCbcDecrypt(IN VOID *AesContext, IN CONST UINT8 *Input, IN UINTN InputSize, IN CONST UINT8 *Ivec, OUT UINT8 *Output)
Definition: CryptAes.c:174
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID EFIAPI Input(IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen)
Definition: EdbSupportUI.c:187
VOID EFIAPI FreePool(IN VOID *Buffer)
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define ARRAY_SIZE(Array)
Definition: Base.h:1393
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define GLOBAL_REMOVE_IF_UNREFERENCED
Definition: Base.h:48
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
VOID * UNIT_TEST_CONTEXT
Definition: UnitTestLib.h:54
#define UT_ASSERT_MEM_EQUAL(BufferA, BufferB, Length)
Definition: UnitTestLib.h:389
#define UT_ASSERT_TRUE(Expression)
Definition: UnitTestLib.h:350
UINT32 UNIT_TEST_STATUS
Definition: UnitTestLib.h:16