os/security/cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4_plugin/tasync.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
/**
sl@0
    20
 @file
sl@0
    21
 @internalComponent
sl@0
    22
 @released
sl@0
    23
*/
sl@0
    24
#include "cryptodriver.h"
sl@0
    25
#include <e32base.h>
sl@0
    26
#include <e32cons.h>
sl@0
    27
#include <e32test.h>
sl@0
    28
#include <e32debug.h>
sl@0
    29
#include <rijndael.h>
sl@0
    30
#include <cbcmode.h>
sl@0
    31
#include <padding.h>
sl@0
    32
#include <bufferedtransformation.h>
sl@0
    33
sl@0
    34
_LIT(KTxtEPOC32EX,"tasync: mainL failed");
sl@0
    35
_LIT(KTxtPressAnyKey," [press any key]");
sl@0
    36
sl@0
    37
//#define KEYLEN 16
sl@0
    38
#define KEYLEN 24
sl@0
    39
//#define KEYLEN 32
sl@0
    40
sl@0
    41
//#define BUFLEN 256
sl@0
    42
//#define BUFLEN (256*16)
sl@0
    43
#define BUFLEN 32
sl@0
    44
#define LOOPCOUNT 10000
sl@0
    45
sl@0
    46
sl@0
    47
// public
sl@0
    48
CConsoleBase* console; // write all your messages to this
sl@0
    49
sl@0
    50
// private
sl@0
    51
LOCAL_C void mainL();
sl@0
    52
sl@0
    53
GLDEF_C TInt E32Main() // main function called by E32
sl@0
    54
    {
sl@0
    55
	__UHEAP_MARK;
sl@0
    56
	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
sl@0
    57
	TRAPD(error,mainL()); // more initialization, then do example
sl@0
    58
	__ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error));
sl@0
    59
	delete cleanup; // destroy clean-up stack
sl@0
    60
	__UHEAP_MARKEND;
sl@0
    61
	return 0; // and return
sl@0
    62
    }
sl@0
    63
sl@0
    64
LOCAL_D RTest test(_L("tasync"));
sl@0
    65
sl@0
    66
LOCAL_D void dumpBuffer(const TDesC &aName, const TDesC8 &aBuf);
sl@0
    67
sl@0
    68
LOCAL_C void encryptL(const TDesC8 &aKey, const TDesC8 &aIV, const TDesC8 &aPlainText, 
sl@0
    69
					  TDes8 &aCipherText);
sl@0
    70
LOCAL_C void decryptL(const TDesC8 &aKey, const TDesC8 &aIV, const TDesC8 &aCiphertext, 
sl@0
    71
					  TDes8 &aPlaintext);
sl@0
    72
sl@0
    73
LOCAL_C void mainL() // initialize and call example code under cleanup stack
sl@0
    74
    {
sl@0
    75
	test.Title();
sl@0
    76
	//
sl@0
    77
	// Generate key and IV
sl@0
    78
	//
sl@0
    79
    test.Start(_L(" @SYMTestCaseID:SEC-CRYPTOSPI-ASYNC-0001 Generating key & IV for AES tests "));
sl@0
    80
	test.Next(_L("Generating key\n"));
sl@0
    81
	// Generate 16 byte key
sl@0
    82
	TBuf8<KEYLEN> key;
sl@0
    83
	key.SetLength(KEYLEN);
sl@0
    84
	key[0] = 'K';
sl@0
    85
	key[1] = 'E';
sl@0
    86
	key[2] = 'Y';
sl@0
    87
	key[3] = '*';
sl@0
    88
	for(int z=4; z<KEYLEN; ++z) key[z] = z;
sl@0
    89
sl@0
    90
sl@0
    91
	test.Next(_L("Generating IV\n"));
sl@0
    92
	TBuf8<16> iv;
sl@0
    93
	iv.SetLength(iv.MaxLength());
sl@0
    94
	iv[0] = 'I';
sl@0
    95
	iv[1] = 'V';
sl@0
    96
	iv[2] = '*';
sl@0
    97
	iv[3] = '*';
sl@0
    98
sl@0
    99
	TBuf8<BUFLEN> plaintext;
sl@0
   100
	plaintext.FillZ();
sl@0
   101
	plaintext.SetLength(plaintext.MaxLength());
sl@0
   102
	plaintext[0] = 'P';
sl@0
   103
	plaintext[1] = 'L';
sl@0
   104
	plaintext[2] = 'A';
sl@0
   105
	plaintext[3] = 'I';
sl@0
   106
	plaintext[4] = 'N';
sl@0
   107
	plaintext[5] = '1';
sl@0
   108
	for(int i=6; i<BUFLEN/2; ++i)
sl@0
   109
		{
sl@0
   110
		plaintext[i] = i;
sl@0
   111
		}
sl@0
   112
	plaintext[BUFLEN/2] = 'P';
sl@0
   113
	plaintext[BUFLEN/2+1] = 'L';
sl@0
   114
	plaintext[BUFLEN/2+2] = 'A';
sl@0
   115
	plaintext[BUFLEN/2+3] = 'I';
sl@0
   116
	plaintext[BUFLEN/2+4] = 'N';
sl@0
   117
	plaintext[BUFLEN/2+5] = '2';
sl@0
   118
	for(int i=BUFLEN/2+6; i<BUFLEN; ++i)
sl@0
   119
		{
sl@0
   120
		plaintext[i] = i;
sl@0
   121
		}
sl@0
   122
	test.End();
sl@0
   123
sl@0
   124
	TBuf8<BUFLEN+16> ciphertext;
sl@0
   125
	encryptL(key, iv, plaintext, ciphertext);
sl@0
   126
sl@0
   127
	TBuf8<BUFLEN> plaintext2;
sl@0
   128
	decryptL(key, iv, ciphertext, plaintext2);
sl@0
   129
sl@0
   130
	test.Printf(_L("Checking plaintext2 == plaintext\n"));
sl@0
   131
	test(plaintext2 == plaintext);
sl@0
   132
sl@0
   133
	test.Printf(KTxtPressAnyKey);
sl@0
   134
	test.Getch(); // get and ignore character
sl@0
   135
	test.Close();
sl@0
   136
sl@0
   137
	}
sl@0
   138
sl@0
   139
LOCAL_C void encryptL(const TDesC8 &aKey, const TDesC8 &aIV, const TDesC8 &aPlaintext, 
sl@0
   140
					  TDes8 &aCiphertext)
sl@0
   141
	{
sl@0
   142
	RDebug::Printf("Starting tasync encryption tests\n");
sl@0
   143
	
sl@0
   144
	TPtrC8 chunk1(aPlaintext.Left(16));
sl@0
   145
	TPtrC8 chunk2(aPlaintext.Mid(16, aPlaintext.Length()-16));
sl@0
   146
	
sl@0
   147
	
sl@0
   148
	//
sl@0
   149
	// Encrypt using legacy API - Reference
sl@0
   150
	//
sl@0
   151
	TBuf8<BUFLEN+16> sw;
sl@0
   152
	sw.FillZ();
sl@0
   153
	sw.SetLength(0);
sl@0
   154
sl@0
   155
	test.Start(_L("AES - S/W - Reference encrypt"));
sl@0
   156
	
sl@0
   157
	test.Printf(_L("    CBC\n"));
sl@0
   158
	CAESEncryptor *rawaes = CAESEncryptor::NewLC(aKey); // rawaes
sl@0
   159
	CModeCBCEncryptor *cbc = CModeCBCEncryptor::NewL(rawaes, aIV);
sl@0
   160
	CleanupStack::Pop(rawaes); //
sl@0
   161
	CleanupStack::PushL(cbc);  // cbc
sl@0
   162
	
sl@0
   163
	CPadding *pad = CPaddingPKCS7::NewLC(16); // cbc, pad
sl@0
   164
	CBufferedEncryptor *aes = CBufferedEncryptor::NewL(cbc, pad);
sl@0
   165
	CleanupStack::Pop(pad); // cbc
sl@0
   166
	CleanupStack::Pop(cbc);
sl@0
   167
	CleanupStack::PushL(aes); // aes
sl@0
   168
		
sl@0
   169
	test.Printf(_L("About to s/w encrypt (old api)\n"));
sl@0
   170
	aes->Process(chunk1, sw);
sl@0
   171
	aes->ProcessFinalL(chunk2, sw);
sl@0
   172
	dumpBuffer(_L("sw"), sw);
sl@0
   173
		
sl@0
   174
	CleanupStack::PopAndDestroy(aes);
sl@0
   175
sl@0
   176
	//
sl@0
   177
	// Encrypt using legacy API
sl@0
   178
	//
sl@0
   179
	test.Start(_L("AES - S/W - Legacy API - Parallel encrypt"));
sl@0
   180
	
sl@0
   181
	test.Printf(_L("    CBC2\n"));
sl@0
   182
	TBuf8<BUFLEN+16> sw2;
sl@0
   183
	sw2.FillZ();
sl@0
   184
	sw2.SetLength(0);
sl@0
   185
	CAESEncryptor *rawaes2 = CAESEncryptor::NewLC(aKey); // rawaes2
sl@0
   186
	CModeCBCEncryptor *cbc2 = CModeCBCEncryptor::NewL(rawaes2, aIV);
sl@0
   187
	CleanupStack::Pop(rawaes2); //
sl@0
   188
	CleanupStack::PushL(cbc2);  // cbc2
sl@0
   189
	
sl@0
   190
	CPadding *pad2 = CPaddingPKCS7::NewLC(16); // cbc2, pad2
sl@0
   191
	CBufferedEncryptor *aes2 = CBufferedEncryptor::NewL(cbc2, pad2);
sl@0
   192
	CleanupStack::Pop(pad2); // cbc2
sl@0
   193
	CleanupStack::Pop(cbc2);
sl@0
   194
	CleanupStack::PushL(aes2); // aes2
sl@0
   195
sl@0
   196
	test.Printf(_L("    CBC3\n"));
sl@0
   197
	TBuf8<BUFLEN+16> sw3;
sl@0
   198
	sw3.FillZ();
sl@0
   199
	sw3.SetLength(0);
sl@0
   200
	CAESEncryptor *rawaes3 = CAESEncryptor::NewLC(aKey); // rawaes3
sl@0
   201
	CModeCBCEncryptor *cbc3 = CModeCBCEncryptor::NewL(rawaes3, aIV);
sl@0
   202
	CleanupStack::Pop(rawaes3); //
sl@0
   203
	CleanupStack::PushL(cbc3);  // cbc3
sl@0
   204
	
sl@0
   205
	CPadding *pad3 = CPaddingPKCS7::NewLC(16); // cbc3, pad3
sl@0
   206
	CBufferedEncryptor *aes3 = CBufferedEncryptor::NewL(cbc3, pad3);
sl@0
   207
	CleanupStack::Pop(pad3); // cbc3
sl@0
   208
	CleanupStack::Pop(cbc3);
sl@0
   209
	CleanupStack::PushL(aes3); // aes3
sl@0
   210
	
sl@0
   211
	test.Printf(_L("About to parallel encrypt\n"));
sl@0
   212
#if 1
sl@0
   213
	// Parallel
sl@0
   214
	aes2->Process(chunk1, sw2);
sl@0
   215
	aes3->Process(chunk1, sw3);
sl@0
   216
	aes2->ProcessFinalL(chunk2, sw2);
sl@0
   217
	aes3->ProcessFinalL(chunk2, sw3);
sl@0
   218
#else
sl@0
   219
	// Sequential
sl@0
   220
	aes2->Process(chunk1, sw2);
sl@0
   221
	aes2->ProcessFinalL(chunk2, sw2);
sl@0
   222
	aes3->Process(chunk1, sw3);
sl@0
   223
	aes3->ProcessFinalL(chunk2, sw3);
sl@0
   224
#endif		
sl@0
   225
sl@0
   226
	dumpBuffer(_L("sw2"), sw2);
sl@0
   227
	dumpBuffer(_L("sw3"), sw3);
sl@0
   228
sl@0
   229
sl@0
   230
	CleanupStack::PopAndDestroy(aes3);
sl@0
   231
	CleanupStack::PopAndDestroy(aes2);
sl@0
   232
sl@0
   233
	test.Printf(_L("Checking sw2 == sw3\n"));
sl@0
   234
	test(sw2 == sw3);
sl@0
   235
sl@0
   236
	test.Printf(_L("Checking sw2 == sw\n"));
sl@0
   237
	test(sw2 == sw);
sl@0
   238
sl@0
   239
	aCiphertext = sw;
sl@0
   240
sl@0
   241
    test.End();
sl@0
   242
	}
sl@0
   243
sl@0
   244
LOCAL_C void decryptL(const TDesC8 &aKey, const TDesC8 &aIV, const TDesC8 &aCiphertext, 
sl@0
   245
					  TDes8 &aPlaintext)
sl@0
   246
	{
sl@0
   247
	RDebug::Printf("Starting tasync decryption tests\n");
sl@0
   248
	
sl@0
   249
	TPtrC8 chunk1(aCiphertext.Left(16));
sl@0
   250
	TPtrC8 chunk2(aCiphertext.Mid(16, aCiphertext.Length()-16));
sl@0
   251
	
sl@0
   252
	//
sl@0
   253
	// Decrypt using legacy API - Reference
sl@0
   254
	//
sl@0
   255
	TBuf8<BUFLEN+16> sw;
sl@0
   256
	sw.FillZ();
sl@0
   257
	sw.SetLength(0);
sl@0
   258
sl@0
   259
	test.Start(_L("AES - S/W - Reference decrypt"));
sl@0
   260
	
sl@0
   261
	test.Printf(_L("    CBC\n"));
sl@0
   262
	CAESDecryptor *rawaes = CAESDecryptor::NewLC(aKey); // rawaes
sl@0
   263
	CModeCBCDecryptor *cbc = CModeCBCDecryptor::NewL(rawaes, aIV);
sl@0
   264
	CleanupStack::Pop(rawaes); //
sl@0
   265
	CleanupStack::PushL(cbc);  // cbc
sl@0
   266
	
sl@0
   267
	CPadding *pad = CPaddingPKCS7::NewLC(16); // cbc, pad
sl@0
   268
	CBufferedDecryptor *aes = CBufferedDecryptor::NewL(cbc, pad);
sl@0
   269
	CleanupStack::Pop(pad); // cbc
sl@0
   270
	CleanupStack::Pop(cbc);
sl@0
   271
	CleanupStack::PushL(aes); // aes
sl@0
   272
		
sl@0
   273
	test.Printf(_L("About to s/w decrypt (old api)\n"));
sl@0
   274
	aes->Process(chunk1, sw);
sl@0
   275
	aes->ProcessFinalL(chunk2, sw);
sl@0
   276
	dumpBuffer(_L("sw"), sw);
sl@0
   277
		
sl@0
   278
	CleanupStack::PopAndDestroy(aes);
sl@0
   279
sl@0
   280
	//
sl@0
   281
	// Decrypt using legacy API
sl@0
   282
	//
sl@0
   283
	test.Start(_L("AES - S/W - Legacy API - Parallel decrypt"));
sl@0
   284
	
sl@0
   285
	test.Printf(_L("    CBC2\n"));
sl@0
   286
	TBuf8<BUFLEN+16> sw2;
sl@0
   287
	sw2.FillZ();
sl@0
   288
	sw2.SetLength(0);
sl@0
   289
	CAESDecryptor *rawaes2 = CAESDecryptor::NewLC(aKey); // rawaes2
sl@0
   290
	CModeCBCDecryptor *cbc2 = CModeCBCDecryptor::NewL(rawaes2, aIV);
sl@0
   291
	CleanupStack::Pop(rawaes2); //
sl@0
   292
	CleanupStack::PushL(cbc2);  // cbc2
sl@0
   293
	
sl@0
   294
	CPadding *pad2 = CPaddingPKCS7::NewLC(16); // cbc2, pad2
sl@0
   295
	CBufferedDecryptor *aes2 = CBufferedDecryptor::NewL(cbc2, pad2);
sl@0
   296
	CleanupStack::Pop(pad2); // cbc2
sl@0
   297
	CleanupStack::Pop(cbc2);
sl@0
   298
	CleanupStack::PushL(aes2); // aes2
sl@0
   299
sl@0
   300
	test.Printf(_L("    CBC3\n"));
sl@0
   301
	TBuf8<BUFLEN+16> sw3;
sl@0
   302
	sw3.FillZ();
sl@0
   303
	sw3.SetLength(0);
sl@0
   304
	CAESDecryptor *rawaes3 = CAESDecryptor::NewLC(aKey); // rawaes3
sl@0
   305
	CModeCBCDecryptor *cbc3 = CModeCBCDecryptor::NewL(rawaes3, aIV);
sl@0
   306
	CleanupStack::Pop(rawaes3); //
sl@0
   307
	CleanupStack::PushL(cbc3);  // cbc3
sl@0
   308
	
sl@0
   309
	CPadding *pad3 = CPaddingPKCS7::NewLC(16); // cbc3, pad3
sl@0
   310
	CBufferedDecryptor *aes3 = CBufferedDecryptor::NewL(cbc3, pad3);
sl@0
   311
	CleanupStack::Pop(pad3); // cbc3
sl@0
   312
	CleanupStack::Pop(cbc3);
sl@0
   313
	CleanupStack::PushL(aes3); // aes3
sl@0
   314
	
sl@0
   315
	test.Printf(_L("About to parallel decrypt\n"));
sl@0
   316
sl@0
   317
	// Parallel
sl@0
   318
	aes2->Process(chunk1, sw2);
sl@0
   319
	aes3->Process(chunk1, sw3);
sl@0
   320
	aes2->ProcessFinalL(chunk2, sw2);
sl@0
   321
	aes3->ProcessFinalL(chunk2, sw3);
sl@0
   322
sl@0
   323
	dumpBuffer(_L("sw2"), sw2);
sl@0
   324
	dumpBuffer(_L("sw3"), sw3);
sl@0
   325
sl@0
   326
sl@0
   327
	CleanupStack::PopAndDestroy(aes3);
sl@0
   328
	CleanupStack::PopAndDestroy(aes2);
sl@0
   329
sl@0
   330
	test.Printf(_L("Checking sw2 == sw3\n"));
sl@0
   331
	test(sw2 == sw3);
sl@0
   332
sl@0
   333
	test.Printf(_L("Checking sw2 == sw\n"));
sl@0
   334
	test(sw2 == sw);
sl@0
   335
sl@0
   336
	aPlaintext = sw;
sl@0
   337
sl@0
   338
    test.End();
sl@0
   339
    }
sl@0
   340
sl@0
   341
sl@0
   342
sl@0
   343
LOCAL_D void dumpBuffer(const TDesC &aName, const TDesC8 &aBuf)
sl@0
   344
	{
sl@0
   345
	test.Printf(_L("%S ="), &aName);
sl@0
   346
	TInt len = aBuf.Length();
sl@0
   347
	for(TInt i = 0 ; i < len; ++i)
sl@0
   348
		{
sl@0
   349
		if(i%16 == 0)
sl@0
   350
			{
sl@0
   351
			test.Printf(_L("\n    "));
sl@0
   352
			}
sl@0
   353
		test.Printf(_L("%02x "), aBuf[i]);
sl@0
   354
		}
sl@0
   355
	test.Printf(_L("\n"));
sl@0
   356
	}
sl@0
   357
sl@0
   358
sl@0
   359
// End of file