os/security/crypto/weakcrypto/source/symmetric/rijndael.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2002-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
#include "rijndael.h"
sl@0
    20
#include "rijndaeltables.h"
sl@0
    21
#include "../common/inlines.h"
sl@0
    22
#include <cryptostrength.h>
sl@0
    23
sl@0
    24
const TUint KAESKeyBytes128 = 16;
sl@0
    25
const TUint KAESKeyBytes192 = 24;
sl@0
    26
const TUint KAESKeyBytes256 = 32;
sl@0
    27
const TUint KAESBlockBytes = 16;
sl@0
    28
sl@0
    29
/* CRijndael */
sl@0
    30
EXPORT_C CRijndael::CRijndael(void)
sl@0
    31
	{
sl@0
    32
	}
sl@0
    33
sl@0
    34
void CRijndael::Reset()
sl@0
    35
	{
sl@0
    36
	SetKey(*iKey);
sl@0
    37
	}
sl@0
    38
sl@0
    39
TInt CRijndael::KeySize() const
sl@0
    40
	{
sl@0
    41
	return (4*(iRounds+1));
sl@0
    42
	}
sl@0
    43
sl@0
    44
CRijndael::~CRijndael()
sl@0
    45
	{
sl@0
    46
	delete iKey;
sl@0
    47
	}
sl@0
    48
sl@0
    49
void CRijndael::ConstructL(const TDesC8& aKey)
sl@0
    50
	{
sl@0
    51
	TUint keySize = aKey.Size();
sl@0
    52
	assert((keySize==KAESKeyBytes128)||(keySize==KAESKeyBytes192)||(keySize==KAESKeyBytes256));
sl@0
    53
	iKey = aKey.AllocL();
sl@0
    54
	iRounds = keySize/4 + 6;
sl@0
    55
	SetKey(aKey);
sl@0
    56
	}
sl@0
    57
sl@0
    58
void CRijndael::SetKey(const TDesC8& aKey)
sl@0
    59
	{
sl@0
    60
	TUint keySize = aKey.Size();
sl@0
    61
	TUint32 temp; 
sl@0
    62
	TUint32* rk = &iK[0];
sl@0
    63
sl@0
    64
	TUint i = 0;
sl@0
    65
sl@0
    66
	GetUserKeyBigEndian(rk, keySize/4, &aKey[0], keySize);
sl@0
    67
sl@0
    68
	switch(keySize)
sl@0
    69
		{
sl@0
    70
		case (KAESKeyBytes128):
sl@0
    71
			{
sl@0
    72
			FOREVER
sl@0
    73
				{
sl@0
    74
				temp  = rk[3];
sl@0
    75
				rk[4] = rk[0] ^
sl@0
    76
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 2)] & 0xff000000) ^
sl@0
    77
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^
sl@0
    78
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^
sl@0
    79
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 3)] & 0x000000ff) ^
sl@0
    80
					RIJNDAEL_TABLE::rcon[i];
sl@0
    81
				rk[5] = rk[1] ^ rk[4];
sl@0
    82
				rk[6] = rk[2] ^ rk[5];
sl@0
    83
				rk[7] = rk[3] ^ rk[6];
sl@0
    84
				if (++i == 10)
sl@0
    85
					break;
sl@0
    86
				rk += 4;
sl@0
    87
				}
sl@0
    88
			}
sl@0
    89
		break;
sl@0
    90
sl@0
    91
		case (KAESKeyBytes192):
sl@0
    92
			{
sl@0
    93
			FOREVER
sl@0
    94
				{
sl@0
    95
				temp = rk[ 5];
sl@0
    96
				rk[ 6] = rk[ 0] ^
sl@0
    97
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 2)] & 0xff000000) ^
sl@0
    98
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^
sl@0
    99
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^
sl@0
   100
					(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 3)] & 0x000000ff) ^
sl@0
   101
					RIJNDAEL_TABLE::rcon[i];
sl@0
   102
				rk[ 7] = rk[ 1] ^ rk[ 6];
sl@0
   103
				rk[ 8] = rk[ 2] ^ rk[ 7];
sl@0
   104
				rk[ 9] = rk[ 3] ^ rk[ 8];
sl@0
   105
				if (++i == 8)
sl@0
   106
					break;
sl@0
   107
				rk[10] = rk[ 4] ^ rk[ 9];
sl@0
   108
				rk[11] = rk[ 5] ^ rk[10];
sl@0
   109
				rk += 6;
sl@0
   110
				}
sl@0
   111
			}
sl@0
   112
		break;
sl@0
   113
sl@0
   114
		case (KAESKeyBytes256):
sl@0
   115
			{
sl@0
   116
			FOREVER
sl@0
   117
				{
sl@0
   118
        		temp = rk[ 7];
sl@0
   119
        		rk[ 8] = rk[ 0] ^
sl@0
   120
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 2)] & 0xff000000) ^
sl@0
   121
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 1)] & 0x00ff0000) ^
sl@0
   122
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 0)] & 0x0000ff00) ^
sl@0
   123
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 3)] & 0x000000ff) ^
sl@0
   124
        			RIJNDAEL_TABLE::rcon[i];
sl@0
   125
        		rk[ 9] = rk[ 1] ^ rk[ 8];
sl@0
   126
        		rk[10] = rk[ 2] ^ rk[ 9];
sl@0
   127
        		rk[11] = rk[ 3] ^ rk[10];
sl@0
   128
				if (++i == 7)
sl@0
   129
					break;
sl@0
   130
        		temp = rk[11];
sl@0
   131
        		rk[12] = rk[ 4] ^
sl@0
   132
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 3)] & 0xff000000) ^
sl@0
   133
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 2)] & 0x00ff0000) ^
sl@0
   134
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 1)] & 0x0000ff00) ^
sl@0
   135
        			(RIJNDAEL_TABLE::Te4[GETBYTE(temp, 0)] & 0x000000ff);
sl@0
   136
        		rk[13] = rk[ 5] ^ rk[12];
sl@0
   137
        		rk[14] = rk[ 6] ^ rk[13];
sl@0
   138
        		rk[15] = rk[ 7] ^ rk[14];
sl@0
   139
sl@0
   140
				rk += 8;
sl@0
   141
				}
sl@0
   142
			}
sl@0
   143
		break;
sl@0
   144
sl@0
   145
		default:
sl@0
   146
			assert(0);	//	Shouldn't get here, keeps compiler happy
sl@0
   147
		}
sl@0
   148
	}
sl@0
   149
sl@0
   150
sl@0
   151
/* CAESEncryptor */
sl@0
   152
EXPORT_C CAESEncryptor* CAESEncryptor::NewL(const TDesC8& aKey)
sl@0
   153
	{
sl@0
   154
	CAESEncryptor* me = CAESEncryptor::NewLC(aKey);
sl@0
   155
	CleanupStack::Pop(me);
sl@0
   156
	return (me);
sl@0
   157
	}
sl@0
   158
sl@0
   159
EXPORT_C CAESEncryptor* CAESEncryptor::NewLC(const TDesC8& aKey)
sl@0
   160
	{
sl@0
   161
	CAESEncryptor* me = new (ELeave) CAESEncryptor();
sl@0
   162
	CleanupStack::PushL(me);
sl@0
   163
	me->ConstructL(aKey);
sl@0
   164
	TCrypto::IsSymmetricWeakEnoughL(BytesToBits(aKey.Size()));
sl@0
   165
	return (me);
sl@0
   166
	}
sl@0
   167
sl@0
   168
TInt CAESEncryptor::BlockSize() const
sl@0
   169
	{
sl@0
   170
	return KAESBlockBytes;
sl@0
   171
	}
sl@0
   172
sl@0
   173
void CAESEncryptor::Transform(TDes8& aBlock)
sl@0
   174
	{
sl@0
   175
	assert((TUint)aBlock.Size()==KAESBlockBytes);
sl@0
   176
	
sl@0
   177
	TUint32 s0, s1, s2, s3, t0, t1, t2, t3;
sl@0
   178
	const TUint32* rk = &iK[0];
sl@0
   179
sl@0
   180
/*
sl@0
   181
 *	map byte array block to cipher state
sl@0
   182
 *	and add initial round key:
sl@0
   183
*/
sl@0
   184
	GetBlockBigEndian((TUint8*)&aBlock[0], s0, s1, s2, s3);
sl@0
   185
	s0 ^= rk[0];
sl@0
   186
	s1 ^= rk[1];
sl@0
   187
	s2 ^= rk[2];
sl@0
   188
	s3 ^= rk[3];
sl@0
   189
/*
sl@0
   190
 *	Nr - 1 full rounds:
sl@0
   191
*/
sl@0
   192
    TUint r = iRounds >> 1;
sl@0
   193
	FOREVER
sl@0
   194
		{
sl@0
   195
        t0 =
sl@0
   196
            RIJNDAEL_TABLE::Te0[GETBYTE(s0, 3)] ^
sl@0
   197
            RIJNDAEL_TABLE::Te1[GETBYTE(s1, 2)] ^
sl@0
   198
            RIJNDAEL_TABLE::Te2[GETBYTE(s2, 1)] ^
sl@0
   199
            RIJNDAEL_TABLE::Te3[GETBYTE(s3, 0)] ^
sl@0
   200
            rk[4];
sl@0
   201
        t1 =
sl@0
   202
            RIJNDAEL_TABLE::Te0[GETBYTE(s1, 3)] ^
sl@0
   203
            RIJNDAEL_TABLE::Te1[GETBYTE(s2, 2)] ^
sl@0
   204
            RIJNDAEL_TABLE::Te2[GETBYTE(s3, 1)] ^
sl@0
   205
            RIJNDAEL_TABLE::Te3[GETBYTE(s0, 0)] ^
sl@0
   206
            rk[5];
sl@0
   207
        t2 =
sl@0
   208
            RIJNDAEL_TABLE::Te0[GETBYTE(s2, 3)] ^
sl@0
   209
            RIJNDAEL_TABLE::Te1[GETBYTE(s3, 2)] ^
sl@0
   210
            RIJNDAEL_TABLE::Te2[GETBYTE(s0, 1)] ^
sl@0
   211
            RIJNDAEL_TABLE::Te3[GETBYTE(s1, 0)] ^
sl@0
   212
            rk[6];
sl@0
   213
        t3 =
sl@0
   214
            RIJNDAEL_TABLE::Te0[GETBYTE(s3, 3)] ^
sl@0
   215
            RIJNDAEL_TABLE::Te1[GETBYTE(s0, 2)] ^
sl@0
   216
            RIJNDAEL_TABLE::Te2[GETBYTE(s1, 1)] ^
sl@0
   217
            RIJNDAEL_TABLE::Te3[GETBYTE(s2, 0)] ^
sl@0
   218
            rk[7];
sl@0
   219
sl@0
   220
        rk += 8;
sl@0
   221
        if (--r == 0) 
sl@0
   222
			break;
sl@0
   223
        
sl@0
   224
        s0 =
sl@0
   225
            RIJNDAEL_TABLE::Te0[GETBYTE(t0, 3)] ^
sl@0
   226
            RIJNDAEL_TABLE::Te1[GETBYTE(t1, 2)] ^
sl@0
   227
            RIJNDAEL_TABLE::Te2[GETBYTE(t2, 1)] ^
sl@0
   228
            RIJNDAEL_TABLE::Te3[GETBYTE(t3, 0)] ^
sl@0
   229
            rk[0];
sl@0
   230
        s1 =
sl@0
   231
            RIJNDAEL_TABLE::Te0[GETBYTE(t1, 3)] ^
sl@0
   232
            RIJNDAEL_TABLE::Te1[GETBYTE(t2, 2)] ^
sl@0
   233
            RIJNDAEL_TABLE::Te2[GETBYTE(t3, 1)] ^
sl@0
   234
            RIJNDAEL_TABLE::Te3[GETBYTE(t0, 0)] ^
sl@0
   235
            rk[1];
sl@0
   236
        s2 =
sl@0
   237
            RIJNDAEL_TABLE::Te0[GETBYTE(t2, 3)] ^
sl@0
   238
            RIJNDAEL_TABLE::Te1[GETBYTE(t3, 2)] ^
sl@0
   239
            RIJNDAEL_TABLE::Te2[GETBYTE(t0, 1)] ^
sl@0
   240
            RIJNDAEL_TABLE::Te3[GETBYTE(t1, 0)] ^
sl@0
   241
            rk[2];
sl@0
   242
        s3 =
sl@0
   243
            RIJNDAEL_TABLE::Te0[GETBYTE(t3, 3)] ^
sl@0
   244
            RIJNDAEL_TABLE::Te1[GETBYTE(t0, 2)] ^
sl@0
   245
            RIJNDAEL_TABLE::Te2[GETBYTE(t1, 1)] ^
sl@0
   246
            RIJNDAEL_TABLE::Te3[GETBYTE(t2, 0)] ^
sl@0
   247
            rk[3];
sl@0
   248
		}
sl@0
   249
/*
sl@0
   250
 *	apply last round and
sl@0
   251
 *	map cipher state to byte array block:
sl@0
   252
*/
sl@0
   253
sl@0
   254
	s0 =
sl@0
   255
		(RIJNDAEL_TABLE::Te4[GETBYTE(t0, 3)] & 0xff000000) ^
sl@0
   256
		(RIJNDAEL_TABLE::Te4[GETBYTE(t1, 2)] & 0x00ff0000) ^
sl@0
   257
		(RIJNDAEL_TABLE::Te4[GETBYTE(t2, 1)] & 0x0000ff00) ^
sl@0
   258
		(RIJNDAEL_TABLE::Te4[GETBYTE(t3, 0)] & 0x000000ff) ^
sl@0
   259
		rk[0];
sl@0
   260
	s1 =
sl@0
   261
		(RIJNDAEL_TABLE::Te4[GETBYTE(t1, 3)] & 0xff000000) ^
sl@0
   262
		(RIJNDAEL_TABLE::Te4[GETBYTE(t2, 2)] & 0x00ff0000) ^
sl@0
   263
		(RIJNDAEL_TABLE::Te4[GETBYTE(t3, 1)] & 0x0000ff00) ^
sl@0
   264
		(RIJNDAEL_TABLE::Te4[GETBYTE(t0, 0)] & 0x000000ff) ^
sl@0
   265
		rk[1];
sl@0
   266
	s2 =
sl@0
   267
		(RIJNDAEL_TABLE::Te4[GETBYTE(t2, 3)] & 0xff000000) ^
sl@0
   268
		(RIJNDAEL_TABLE::Te4[GETBYTE(t3, 2)] & 0x00ff0000) ^
sl@0
   269
		(RIJNDAEL_TABLE::Te4[GETBYTE(t0, 1)] & 0x0000ff00) ^
sl@0
   270
		(RIJNDAEL_TABLE::Te4[GETBYTE(t1, 0)] & 0x000000ff) ^
sl@0
   271
		rk[2];
sl@0
   272
	s3 =
sl@0
   273
		(RIJNDAEL_TABLE::Te4[GETBYTE(t3, 3)] & 0xff000000) ^
sl@0
   274
		(RIJNDAEL_TABLE::Te4[GETBYTE(t0, 2)] & 0x00ff0000) ^
sl@0
   275
		(RIJNDAEL_TABLE::Te4[GETBYTE(t1, 1)] & 0x0000ff00) ^
sl@0
   276
		(RIJNDAEL_TABLE::Te4[GETBYTE(t2, 0)] & 0x000000ff) ^
sl@0
   277
		rk[3];
sl@0
   278
sl@0
   279
	PutBlockBigEndian((TUint8*)&aBlock[0], s0, s1, s2, s3);
sl@0
   280
	}
sl@0
   281
sl@0
   282
CAESEncryptor::CAESEncryptor(void)
sl@0
   283
	{
sl@0
   284
	}
sl@0
   285
sl@0
   286
/* CAESDecryptor */
sl@0
   287
EXPORT_C CAESDecryptor* CAESDecryptor::NewL(const TDesC8& aKey)
sl@0
   288
	{
sl@0
   289
	CAESDecryptor* me = CAESDecryptor::NewLC(aKey);
sl@0
   290
	CleanupStack::Pop(me);
sl@0
   291
	return (me);
sl@0
   292
	}
sl@0
   293
sl@0
   294
sl@0
   295
EXPORT_C CAESDecryptor* CAESDecryptor::NewLC(const TDesC8& aKey)
sl@0
   296
	{
sl@0
   297
	CAESDecryptor* me = new (ELeave) CAESDecryptor();
sl@0
   298
	CleanupStack::PushL(me);
sl@0
   299
	me->ConstructL(aKey);
sl@0
   300
	TCrypto::IsSymmetricWeakEnoughL(BytesToBits(aKey.Size()));
sl@0
   301
	return (me);
sl@0
   302
	}
sl@0
   303
sl@0
   304
TInt CAESDecryptor::BlockSize() const
sl@0
   305
	{
sl@0
   306
	return KAESBlockBytes;
sl@0
   307
	}
sl@0
   308
sl@0
   309
void CAESDecryptor::Transform(TDes8& aBlock)
sl@0
   310
	{
sl@0
   311
	TUint32 s0, s1, s2, s3, t0, t1, t2, t3;
sl@0
   312
    const TUint32* rk = &iK[0];
sl@0
   313
sl@0
   314
/*
sl@0
   315
 *	map byte array block to cipher state
sl@0
   316
 *	and add initial round key:
sl@0
   317
*/
sl@0
   318
	GetBlockBigEndian((TUint8*)&aBlock[0], s0, s1, s2, s3);
sl@0
   319
sl@0
   320
	s0 ^= rk[0];
sl@0
   321
	s1 ^= rk[1];
sl@0
   322
	s2 ^= rk[2];
sl@0
   323
	s3 ^= rk[3];
sl@0
   324
/*
sl@0
   325
 *	Nr - 1 full rounds:
sl@0
   326
*/
sl@0
   327
    TUint r = iRounds >> 1;
sl@0
   328
    FOREVER
sl@0
   329
		{
sl@0
   330
        t0 =
sl@0
   331
            RIJNDAEL_TABLE::Td0[GETBYTE(s0, 3)] ^
sl@0
   332
            RIJNDAEL_TABLE::Td1[GETBYTE(s3, 2)] ^
sl@0
   333
            RIJNDAEL_TABLE::Td2[GETBYTE(s2, 1)] ^
sl@0
   334
            RIJNDAEL_TABLE::Td3[GETBYTE(s1, 0)] ^
sl@0
   335
            rk[4];
sl@0
   336
        t1 =
sl@0
   337
            RIJNDAEL_TABLE::Td0[GETBYTE(s1, 3)] ^
sl@0
   338
            RIJNDAEL_TABLE::Td1[GETBYTE(s0, 2)] ^
sl@0
   339
            RIJNDAEL_TABLE::Td2[GETBYTE(s3, 1)] ^
sl@0
   340
            RIJNDAEL_TABLE::Td3[GETBYTE(s2, 0)] ^
sl@0
   341
            rk[5];
sl@0
   342
        t2 =
sl@0
   343
            RIJNDAEL_TABLE::Td0[GETBYTE(s2, 3)] ^
sl@0
   344
            RIJNDAEL_TABLE::Td1[GETBYTE(s1, 2)] ^
sl@0
   345
            RIJNDAEL_TABLE::Td2[GETBYTE(s0, 1)] ^
sl@0
   346
            RIJNDAEL_TABLE::Td3[GETBYTE(s3, 0)] ^
sl@0
   347
            rk[6];
sl@0
   348
        t3 =
sl@0
   349
            RIJNDAEL_TABLE::Td0[GETBYTE(s3, 3)] ^
sl@0
   350
            RIJNDAEL_TABLE::Td1[GETBYTE(s2, 2)] ^
sl@0
   351
            RIJNDAEL_TABLE::Td2[GETBYTE(s1, 1)] ^
sl@0
   352
            RIJNDAEL_TABLE::Td3[GETBYTE(s0, 0)] ^
sl@0
   353
            rk[7];
sl@0
   354
sl@0
   355
        rk += 8;
sl@0
   356
        if (--r == 0)
sl@0
   357
            break;
sl@0
   358
        
sl@0
   359
        s0 =
sl@0
   360
            RIJNDAEL_TABLE::Td0[GETBYTE(t0, 3)] ^
sl@0
   361
            RIJNDAEL_TABLE::Td1[GETBYTE(t3, 2)] ^
sl@0
   362
            RIJNDAEL_TABLE::Td2[GETBYTE(t2, 1)] ^
sl@0
   363
            RIJNDAEL_TABLE::Td3[GETBYTE(t1, 0)] ^
sl@0
   364
            rk[0];
sl@0
   365
        s1 =
sl@0
   366
            RIJNDAEL_TABLE::Td0[GETBYTE(t1, 3)] ^
sl@0
   367
            RIJNDAEL_TABLE::Td1[GETBYTE(t0, 2)] ^
sl@0
   368
            RIJNDAEL_TABLE::Td2[GETBYTE(t3, 1)] ^
sl@0
   369
            RIJNDAEL_TABLE::Td3[GETBYTE(t2, 0)] ^
sl@0
   370
            rk[1];
sl@0
   371
        s2 =
sl@0
   372
            RIJNDAEL_TABLE::Td0[GETBYTE(t2, 3)] ^
sl@0
   373
            RIJNDAEL_TABLE::Td1[GETBYTE(t1, 2)] ^
sl@0
   374
            RIJNDAEL_TABLE::Td2[GETBYTE(t0, 1)] ^
sl@0
   375
            RIJNDAEL_TABLE::Td3[GETBYTE(t3, 0)] ^
sl@0
   376
            rk[2];
sl@0
   377
        s3 =
sl@0
   378
            RIJNDAEL_TABLE::Td0[GETBYTE(t3, 3)] ^
sl@0
   379
            RIJNDAEL_TABLE::Td1[GETBYTE(t2, 2)] ^
sl@0
   380
            RIJNDAEL_TABLE::Td2[GETBYTE(t1, 1)] ^
sl@0
   381
            RIJNDAEL_TABLE::Td3[GETBYTE(t0, 0)] ^
sl@0
   382
            rk[3];
sl@0
   383
		}
sl@0
   384
/*
sl@0
   385
 *	apply last round and
sl@0
   386
 *	map cipher state to byte array block:
sl@0
   387
*/
sl@0
   388
   	s0 =
sl@0
   389
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t0, 3)] & 0xff000000) ^
sl@0
   390
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t3, 2)] & 0x00ff0000) ^
sl@0
   391
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t2, 1)] & 0x0000ff00) ^
sl@0
   392
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t1, 0)] & 0x000000ff) ^
sl@0
   393
   		rk[0];
sl@0
   394
   	s1 =
sl@0
   395
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t1, 3)] & 0xff000000) ^
sl@0
   396
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t0, 2)] & 0x00ff0000) ^
sl@0
   397
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t3, 1)] & 0x0000ff00) ^
sl@0
   398
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t2, 0)] & 0x000000ff) ^
sl@0
   399
   		rk[1];
sl@0
   400
   	s2 =
sl@0
   401
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t2, 3)] & 0xff000000) ^
sl@0
   402
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t1, 2)] & 0x00ff0000) ^
sl@0
   403
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t0, 1)] & 0x0000ff00) ^
sl@0
   404
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t3, 0)] & 0x000000ff) ^
sl@0
   405
   		rk[2];
sl@0
   406
   	s3 =
sl@0
   407
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t3, 3)] & 0xff000000) ^
sl@0
   408
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t2, 2)] & 0x00ff0000) ^
sl@0
   409
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t1, 1)] & 0x0000ff00) ^
sl@0
   410
   		(RIJNDAEL_TABLE::Td4[GETBYTE(t0, 0)] & 0x000000ff) ^
sl@0
   411
   		rk[3];
sl@0
   412
sl@0
   413
	
sl@0
   414
	PutBlockBigEndian((TUint8*)&aBlock[0], s0, s1, s2, s3);
sl@0
   415
	}
sl@0
   416
sl@0
   417
sl@0
   418
void CAESDecryptor::SetKey(const TDesC8& aKey)
sl@0
   419
	{
sl@0
   420
	CRijndael::SetKey(aKey);
sl@0
   421
sl@0
   422
	TUint i, j;
sl@0
   423
	TUint32* rk = &iK[0];
sl@0
   424
	TUint32 temp;
sl@0
   425
sl@0
   426
//	invert the order of the round keys 
sl@0
   427
	for (i = 0, j = 4*iRounds; i < j; i += 4, j -= 4)
sl@0
   428
		{
sl@0
   429
		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
sl@0
   430
		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
sl@0
   431
		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
sl@0
   432
		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
sl@0
   433
		}
sl@0
   434
sl@0
   435
//	apply the inverse MixColumn transform to all round keys but the first and the last
sl@0
   436
	for (i = 1; i < iRounds; i++)
sl@0
   437
		{
sl@0
   438
		rk += 4;
sl@0
   439
		rk[0] =
sl@0
   440
			RIJNDAEL_TABLE::Td0[RIJNDAEL_TABLE::Te4[GETBYTE(rk[0], 3)] & 0xff] ^
sl@0
   441
			RIJNDAEL_TABLE::Td1[RIJNDAEL_TABLE::Te4[GETBYTE(rk[0], 2)] & 0xff] ^
sl@0
   442
			RIJNDAEL_TABLE::Td2[RIJNDAEL_TABLE::Te4[GETBYTE(rk[0], 1)] & 0xff] ^
sl@0
   443
			RIJNDAEL_TABLE::Td3[RIJNDAEL_TABLE::Te4[GETBYTE(rk[0], 0)] & 0xff];
sl@0
   444
		rk[1] =
sl@0
   445
			RIJNDAEL_TABLE::Td0[RIJNDAEL_TABLE::Te4[GETBYTE(rk[1], 3)] & 0xff] ^
sl@0
   446
			RIJNDAEL_TABLE::Td1[RIJNDAEL_TABLE::Te4[GETBYTE(rk[1], 2)] & 0xff] ^
sl@0
   447
			RIJNDAEL_TABLE::Td2[RIJNDAEL_TABLE::Te4[GETBYTE(rk[1], 1)] & 0xff] ^
sl@0
   448
			RIJNDAEL_TABLE::Td3[RIJNDAEL_TABLE::Te4[GETBYTE(rk[1], 0)] & 0xff];
sl@0
   449
		rk[2] =
sl@0
   450
			RIJNDAEL_TABLE::Td0[RIJNDAEL_TABLE::Te4[GETBYTE(rk[2], 3)] & 0xff] ^
sl@0
   451
			RIJNDAEL_TABLE::Td1[RIJNDAEL_TABLE::Te4[GETBYTE(rk[2], 2)] & 0xff] ^
sl@0
   452
			RIJNDAEL_TABLE::Td2[RIJNDAEL_TABLE::Te4[GETBYTE(rk[2], 1)] & 0xff] ^
sl@0
   453
			RIJNDAEL_TABLE::Td3[RIJNDAEL_TABLE::Te4[GETBYTE(rk[2], 0)] & 0xff];
sl@0
   454
		rk[3] =
sl@0
   455
			RIJNDAEL_TABLE::Td0[RIJNDAEL_TABLE::Te4[GETBYTE(rk[3], 3)] & 0xff] ^
sl@0
   456
			RIJNDAEL_TABLE::Td1[RIJNDAEL_TABLE::Te4[GETBYTE(rk[3], 2)] & 0xff] ^
sl@0
   457
			RIJNDAEL_TABLE::Td2[RIJNDAEL_TABLE::Te4[GETBYTE(rk[3], 1)] & 0xff] ^
sl@0
   458
			RIJNDAEL_TABLE::Td3[RIJNDAEL_TABLE::Te4[GETBYTE(rk[3], 0)] & 0xff];
sl@0
   459
		}
sl@0
   460
	}
sl@0
   461
sl@0
   462
CAESDecryptor::CAESDecryptor()
sl@0
   463
	{	
sl@0
   464
	}