os/security/cryptoplugins/cryptospiplugins/source/softwarecrypto/sha1impl.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) 2006-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
* software sha1 implementation
sl@0
    16
* software sha1 implementation
sl@0
    17
*
sl@0
    18
*/
sl@0
    19
sl@0
    20
sl@0
    21
/**
sl@0
    22
 @file
sl@0
    23
*/
sl@0
    24
sl@0
    25
#include "sha1impl.h"
sl@0
    26
sl@0
    27
#include <cryptospi/hashplugin.h>
sl@0
    28
#include "pluginconfig.h"
sl@0
    29
#define EXPANDLOOP
sl@0
    30
sl@0
    31
sl@0
    32
using namespace SoftwareCrypto;
sl@0
    33
	
sl@0
    34
CSHA1Impl* CSHA1Impl::NewL()
sl@0
    35
	{
sl@0
    36
	CSHA1Impl* self=new (ELeave) CSHA1Impl();
sl@0
    37
	self->Reset();
sl@0
    38
	return self;						
sl@0
    39
	}
sl@0
    40
														
sl@0
    41
CSHA1Impl* CSHA1Impl::NewLC()
sl@0
    42
	{
sl@0
    43
	CSHA1Impl* self=NewL();
sl@0
    44
	CleanupStack::PushL(self);
sl@0
    45
	return self;						
sl@0
    46
	}
sl@0
    47
														
sl@0
    48
CSHA1Impl::CSHA1Impl() : iHash(KSHA1HashSize)
sl@0
    49
	{		
sl@0
    50
	}
sl@0
    51
	
sl@0
    52
CSHA1Impl::CSHA1Impl(const CSHA1Impl& aSHA1Impl)
sl@0
    53
: iHash(aSHA1Impl.iHash),iA(aSHA1Impl.iA),iB(aSHA1Impl.iB),iC(aSHA1Impl.iC),iD(aSHA1Impl.iD),iE(aSHA1Impl.iE),
sl@0
    54
  iNl(aSHA1Impl.iNl),iNh(aSHA1Impl.iNh)
sl@0
    55
	{
sl@0
    56
	(void)Mem::Copy(iData, aSHA1Impl.iData, KSHA1BlockSize*5);
sl@0
    57
	}
sl@0
    58
	
sl@0
    59
CSHA1Impl::~CSHA1Impl()
sl@0
    60
	{	
sl@0
    61
	}
sl@0
    62
	
sl@0
    63
void CSHA1Impl::Reset()
sl@0
    64
	{
sl@0
    65
	iA=0x67452301;
sl@0
    66
	iB=0xefcdab89;
sl@0
    67
	iC=0x98badcfe;
sl@0
    68
	iD=0x10325476;
sl@0
    69
	iE=0xc3d2e1f0;
sl@0
    70
	iNh=0;
sl@0
    71
	iNl=0;
sl@0
    72
	}
sl@0
    73
	
sl@0
    74
void CSHA1Impl::Close()
sl@0
    75
	{
sl@0
    76
	delete this;	
sl@0
    77
	}
sl@0
    78
sl@0
    79
MHash* CSHA1Impl::ReplicateL()
sl@0
    80
	{	 
sl@0
    81
	return CSHA1Impl::NewL();
sl@0
    82
	}
sl@0
    83
	
sl@0
    84
MHash* CSHA1Impl::CopyL()
sl@0
    85
	{
sl@0
    86
	return new(ELeave) CSHA1Impl(*this);	
sl@0
    87
	}
sl@0
    88
sl@0
    89
TUid CSHA1Impl::ImplementationUid()
sl@0
    90
	{
sl@0
    91
	return KCryptoPluginSha1Uid;
sl@0
    92
	}
sl@0
    93
sl@0
    94
void CSHA1Impl::GetCharacteristicsL(const TCharacteristics*& aPluginCharacteristics)
sl@0
    95
	{
sl@0
    96
	aPluginCharacteristics=NULL;
sl@0
    97
	TInt hashNum=sizeof(KHashCharacteristics)/sizeof(THashCharacteristics*);
sl@0
    98
	for (TInt i=0;i<hashNum;i++)
sl@0
    99
		{
sl@0
   100
		if (KHashCharacteristics[i]->cmn.iImplementationUID == ImplementationUid().iUid)
sl@0
   101
			{
sl@0
   102
			aPluginCharacteristics = KHashCharacteristics[i];
sl@0
   103
			break;
sl@0
   104
			}
sl@0
   105
		}	
sl@0
   106
	}
sl@0
   107
sl@0
   108
CExtendedCharacteristics* CSHA1Impl::CreateExtendedCharacteristicsL()
sl@0
   109
	{
sl@0
   110
	// All Symbian software plug-ins have unlimited concurrency, cannot be reserved
sl@0
   111
	// for exclusive use and are not CERTIFIED to be standards compliant.
sl@0
   112
	return CExtendedCharacteristics::NewL(KMaxTInt, EFalse);
sl@0
   113
	}
sl@0
   114
sl@0
   115
const CExtendedCharacteristics* CSHA1Impl::GetExtendedCharacteristicsL()
sl@0
   116
	{
sl@0
   117
	return CSHA1Impl::CreateExtendedCharacteristicsL();
sl@0
   118
	}
sl@0
   119
sl@0
   120
TPtrC8 CSHA1Impl::Hash(const TDesC8& aMessage)
sl@0
   121
	{
sl@0
   122
	TPtrC8 ptr(KNullDesC8());
sl@0
   123
	DoUpdate(aMessage.Ptr(),aMessage.Size());
sl@0
   124
	StoreState();
sl@0
   125
	DoFinal();
sl@0
   126
	ptr.Set(iHash);
sl@0
   127
	RestoreState();
sl@0
   128
	return ptr;
sl@0
   129
	}
sl@0
   130
	
sl@0
   131
void CSHA1Impl::Update(const TDesC8& aMessage)
sl@0
   132
	{
sl@0
   133
	DoUpdate(aMessage.Ptr(),aMessage.Size());	
sl@0
   134
	}
sl@0
   135
	
sl@0
   136
TPtrC8 CSHA1Impl::Final(const TDesC8& aMessage)
sl@0
   137
	{
sl@0
   138
	TPtrC8 ptr(KNullDesC8());
sl@0
   139
	if (aMessage!=KNullDesC8())
sl@0
   140
		{
sl@0
   141
		DoUpdate(aMessage.Ptr(),aMessage.Size());			
sl@0
   142
		}
sl@0
   143
	DoFinal();
sl@0
   144
	ptr.Set(iHash);
sl@0
   145
	Reset();
sl@0
   146
	return ptr;
sl@0
   147
	}
sl@0
   148
sl@0
   149
sl@0
   150
// This assumes a big-endian architecture
sl@0
   151
void CSHA1Impl::DoUpdate(const TUint8* aData,TUint aLength)
sl@0
   152
	{
sl@0
   153
	while((aLength / 4) > 0 && (iNl % 4 == 0))
sl@0
   154
		{
sl@0
   155
		iData[iNl>>2] = aData[0] << 24 | aData[1] << 16 | aData[2] << 8 | aData[3];
sl@0
   156
		iNl+=4;
sl@0
   157
		aData+=4;
sl@0
   158
		aLength-=4;
sl@0
   159
		if(iNl==64) 
sl@0
   160
			{
sl@0
   161
			Block();
sl@0
   162
			iNh+=64;
sl@0
   163
			iNl=0;
sl@0
   164
			}
sl@0
   165
		}
sl@0
   166
sl@0
   167
	while(aLength--)
sl@0
   168
		{
sl@0
   169
		switch (iNl&3) 
sl@0
   170
			{
sl@0
   171
			case 0:
sl@0
   172
				iData[iNl>>2]=((TUint)(*aData))<<24;
sl@0
   173
				break;
sl@0
   174
			case 1:
sl@0
   175
				iData[iNl>>2]|=((TUint)(*aData))<<16;
sl@0
   176
				break;
sl@0
   177
			case 2:
sl@0
   178
				iData[iNl>>2]|=((TUint)(*aData))<<8;
sl@0
   179
				break;
sl@0
   180
			case 3:
sl@0
   181
				iData[iNl>>2]|=((TUint)(*aData));
sl@0
   182
				break;
sl@0
   183
			default:
sl@0
   184
				break;
sl@0
   185
			};
sl@0
   186
			aData++;
sl@0
   187
			iNl++;
sl@0
   188
			if(iNl==64) 
sl@0
   189
				{
sl@0
   190
				Block();
sl@0
   191
				iNh+=64;
sl@0
   192
				iNl=0;
sl@0
   193
				}
sl@0
   194
		}
sl@0
   195
	}
sl@0
   196
sl@0
   197
static inline TUint CSHA1_F(const TUint x,const TUint y,const TUint z)
sl@0
   198
	{
sl@0
   199
	return (x&y) | (~x&z);
sl@0
   200
	}
sl@0
   201
sl@0
   202
static inline TUint CSHA1_G(const TUint x,const TUint y,const TUint z)
sl@0
   203
	{
sl@0
   204
	return x^y^z;
sl@0
   205
	}
sl@0
   206
sl@0
   207
static inline TUint CSHA1_H(const TUint x,const TUint y,const TUint z)
sl@0
   208
	{
sl@0
   209
	return (x&y) | (x&z) | (y&z);
sl@0
   210
	}
sl@0
   211
sl@0
   212
/*static inline TUint CSHA1_I(const TUint x,const TUint y,const TUint z)
sl@0
   213
	{
sl@0
   214
	return x^y^z;
sl@0
   215
	}*/
sl@0
   216
sl@0
   217
#ifdef EXPANDLOOP
sl@0
   218
sl@0
   219
#ifdef MACRO
sl@0
   220
sl@0
   221
#define CSHA1_16(x,y,z,u,t,v,w)					v=CMD_R(x,5)+CSHA1_F(y,z,u)+t+w+0x5a827999;\
sl@0
   222
												y=CMD_R(y,30);t=v;
sl@0
   223
#define CSHA1_20(x,y,z,u,t,v,w0,w3,w8,w14,w16)  v=w3^w8^w14^w16;w0=CMD_R(v,1);\
sl@0
   224
												CSHA1_16(x,y,z,u,t,v,w0);
sl@0
   225
#define CSHA1_40(x,y,z,u,t,v,w0,w3,w8,w14,w16)	v=w3^w8^w14^w16;w0=CMD_R(v,1);\
sl@0
   226
												v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0x6ed9eba1;\
sl@0
   227
												y=CMD_R(y,30);t=v;
sl@0
   228
#define CSHA1_60(x,y,z,u,t,v,w0,w3,w8,w14,w16)	v=w3^w8^w14^w16;w0=CMD_R(v,1);\
sl@0
   229
												v=CMD_R(x,5)+CSHA1_H(y,z,u)+t+w0+0x8f1bbcdc;\
sl@0
   230
												y=CMD_R(y,30);t=v;
sl@0
   231
#define CSHA1_80(x,y,z,u,t,v,w0,w3,w8,w14,w16)	v=w3^w8^w14^w16;w0=CMD_R(v,1);\
sl@0
   232
												v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0xca62c1d6;\
sl@0
   233
												y=CMD_R(y,30);t=v;
sl@0
   234
#else
sl@0
   235
sl@0
   236
static inline void CSHA1_16(const TUint x, TUint& y, const TUint z,
sl@0
   237
							const TUint u, TUint& t, TUint& v, const TUint w)
sl@0
   238
	{
sl@0
   239
	v = CMD_R(x,5) + CSHA1_F(y,z,u) + t + w + 0x5a827999;
sl@0
   240
	y = CMD_R(y,30);
sl@0
   241
	t = v;
sl@0
   242
	}
sl@0
   243
sl@0
   244
static inline void CSHA1_20(const TUint x,TUint& y,const TUint z,
sl@0
   245
							const TUint u,TUint& t,TUint& v,
sl@0
   246
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   247
							const TUint w14,const TUint w16)
sl@0
   248
	{
sl@0
   249
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   250
	w0 = CMD_R(v,1);
sl@0
   251
	CSHA1_16(x,y,z,u,t,v,w0);
sl@0
   252
	}
sl@0
   253
sl@0
   254
static inline void CSHA1_40(const TUint x,TUint& y,const TUint z,
sl@0
   255
							const TUint u,TUint& t,TUint& v,
sl@0
   256
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   257
							const TUint w14,const TUint w16)
sl@0
   258
	{
sl@0
   259
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   260
	w0 = CMD_R(v,1);
sl@0
   261
	v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0x6ed9eba1;
sl@0
   262
	y = CMD_R(y,30);
sl@0
   263
	t = v;
sl@0
   264
	}
sl@0
   265
sl@0
   266
static inline void CSHA1_60(const TUint x,TUint& y,const TUint z,
sl@0
   267
							const TUint u,TUint& t,TUint& v,
sl@0
   268
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   269
							const TUint w14,const TUint w16)
sl@0
   270
	{
sl@0
   271
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   272
	w0 = CMD_R(v,1);
sl@0
   273
	v = CMD_R(x,5) + CSHA1_H(y,z,u) + t + w0 + 0x8f1bbcdc;
sl@0
   274
	y = CMD_R(y,30);
sl@0
   275
	t = v;
sl@0
   276
	}
sl@0
   277
sl@0
   278
static inline void CSHA1_80(const TUint x,TUint& y,const TUint z,
sl@0
   279
							const TUint u,TUint& t,TUint& v,
sl@0
   280
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   281
							const TUint w14,const TUint w16)
sl@0
   282
	{
sl@0
   283
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   284
	w0 = CMD_R(v,1);
sl@0
   285
	v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0xca62c1d6;
sl@0
   286
	y = CMD_R(y,30);
sl@0
   287
	t = v;
sl@0
   288
	}
sl@0
   289
sl@0
   290
#endif // MACRO
sl@0
   291
#endif // EXPANDLOOP
sl@0
   292
sl@0
   293
#ifdef WEIDAI
sl@0
   294
sl@0
   295
template <class T> inline T rotlFixed(T x, unsigned int y)
sl@0
   296
{
sl@0
   297
	ASSERT(y < sizeof(T)*8);
sl@0
   298
	return (x<<y) | (x>>(sizeof(T)*8-y));
sl@0
   299
}
sl@0
   300
sl@0
   301
template<> inline TUint32 rotlFixed<TUint32>(TUint32 x, unsigned int y)
sl@0
   302
{
sl@0
   303
	ASSERT(y < 32);
sl@0
   304
	return y ? CMD_R(x, y) : x;
sl@0
   305
}
sl@0
   306
sl@0
   307
#define blk0(i) (W[i] = iData[i])
sl@0
   308
#define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))
sl@0
   309
sl@0
   310
#define f1(x,y,z) (z^(x&(y^z)))
sl@0
   311
#define f2(x,y,z) (x^y^z)
sl@0
   312
#define f3(x,y,z) ((x&y)|(z&(x|y)))
sl@0
   313
#define f4(x,y,z) (x^y^z)
sl@0
   314
sl@0
   315
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
sl@0
   316
#define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);
sl@0
   317
#define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);
sl@0
   318
#define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rotlFixed(v,5);w=rotlFixed(w,30);
sl@0
   319
#define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rotlFixed(v,5);w=rotlFixed(w,30);
sl@0
   320
#define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rotlFixed(v,5);w=rotlFixed(w,30);
sl@0
   321
sl@0
   322
#endif // WEIDAI
sl@0
   323
sl@0
   324
void CSHA1Impl::Block()
sl@0
   325
	{
sl@0
   326
#ifdef WEIDAI
sl@0
   327
	TUint32 W[16];
sl@0
   328
    /* Copy context->state[] to working vars */
sl@0
   329
    TUint32 a = iA;
sl@0
   330
    TUint32 b = iB;
sl@0
   331
    TUint32 c = iC;
sl@0
   332
    TUint32 d = iD;
sl@0
   333
    TUint32 e = iE;
sl@0
   334
    
sl@0
   335
	/* 4 rounds of 20 operations each. Loop unrolled. */
sl@0
   336
    
sl@0
   337
	R0(a,b,c,d,e, 0); 
sl@0
   338
	R0(e,a,b,c,d, 1); 
sl@0
   339
	R0(d,e,a,b,c, 2); 
sl@0
   340
	R0(c,d,e,a,b, 3);
sl@0
   341
    R0(b,c,d,e,a, 4); 
sl@0
   342
	R0(a,b,c,d,e, 5); 
sl@0
   343
	R0(e,a,b,c,d, 6); 
sl@0
   344
	R0(d,e,a,b,c, 7);
sl@0
   345
    R0(c,d,e,a,b, 8); 
sl@0
   346
	R0(b,c,d,e,a, 9); 
sl@0
   347
	R0(a,b,c,d,e,10); 
sl@0
   348
	R0(e,a,b,c,d,11);
sl@0
   349
    R0(d,e,a,b,c,12); 
sl@0
   350
	R0(c,d,e,a,b,13); 
sl@0
   351
	R0(b,c,d,e,a,14); 
sl@0
   352
	R0(a,b,c,d,e,15);
sl@0
   353
sl@0
   354
    R1(e,a,b,c,d,16); 
sl@0
   355
	R1(d,e,a,b,c,17); 
sl@0
   356
	R1(c,d,e,a,b,18); 
sl@0
   357
	R1(b,c,d,e,a,19);
sl@0
   358
sl@0
   359
    R2(a,b,c,d,e,20); 
sl@0
   360
	R2(e,a,b,c,d,21); 
sl@0
   361
	R2(d,e,a,b,c,22); 
sl@0
   362
	R2(c,d,e,a,b,23);
sl@0
   363
    R2(b,c,d,e,a,24); 
sl@0
   364
	R2(a,b,c,d,e,25); 
sl@0
   365
	R2(e,a,b,c,d,26); 
sl@0
   366
	R2(d,e,a,b,c,27);
sl@0
   367
    R2(c,d,e,a,b,28); 
sl@0
   368
	R2(b,c,d,e,a,29); 
sl@0
   369
	R2(a,b,c,d,e,30); 
sl@0
   370
	R2(e,a,b,c,d,31);
sl@0
   371
    R2(d,e,a,b,c,32); 
sl@0
   372
	R2(c,d,e,a,b,33); 
sl@0
   373
	R2(b,c,d,e,a,34); 
sl@0
   374
	R2(a,b,c,d,e,35);
sl@0
   375
    R2(e,a,b,c,d,36); 
sl@0
   376
	R2(d,e,a,b,c,37); 
sl@0
   377
	R2(c,d,e,a,b,38); 
sl@0
   378
	R2(b,c,d,e,a,39);
sl@0
   379
sl@0
   380
    R3(a,b,c,d,e,40); 
sl@0
   381
	R3(e,a,b,c,d,41); 
sl@0
   382
	R3(d,e,a,b,c,42); 
sl@0
   383
	R3(c,d,e,a,b,43);
sl@0
   384
    R3(b,c,d,e,a,44); 
sl@0
   385
	R3(a,b,c,d,e,45); 
sl@0
   386
	R3(e,a,b,c,d,46); 
sl@0
   387
	R3(d,e,a,b,c,47);
sl@0
   388
    R3(c,d,e,a,b,48); 
sl@0
   389
	R3(b,c,d,e,a,49); 
sl@0
   390
	R3(a,b,c,d,e,50); 
sl@0
   391
	R3(e,a,b,c,d,51);
sl@0
   392
    R3(d,e,a,b,c,52); 
sl@0
   393
	R3(c,d,e,a,b,53); 
sl@0
   394
	R3(b,c,d,e,a,54); 
sl@0
   395
	R3(a,b,c,d,e,55);
sl@0
   396
    R3(e,a,b,c,d,56); 
sl@0
   397
	R3(d,e,a,b,c,57); 
sl@0
   398
	R3(c,d,e,a,b,58); 
sl@0
   399
	R3(b,c,d,e,a,59);
sl@0
   400
sl@0
   401
    R4(a,b,c,d,e,60); 
sl@0
   402
	R4(e,a,b,c,d,61); 
sl@0
   403
	R4(d,e,a,b,c,62); 
sl@0
   404
	R4(c,d,e,a,b,63);
sl@0
   405
    R4(b,c,d,e,a,64); 
sl@0
   406
	R4(a,b,c,d,e,65); 
sl@0
   407
	R4(e,a,b,c,d,66); 
sl@0
   408
	R4(d,e,a,b,c,67);
sl@0
   409
    R4(c,d,e,a,b,68); 
sl@0
   410
	R4(b,c,d,e,a,69); 
sl@0
   411
	R4(a,b,c,d,e,70); 
sl@0
   412
	R4(e,a,b,c,d,71);
sl@0
   413
    R4(d,e,a,b,c,72); 
sl@0
   414
	R4(c,d,e,a,b,73); 
sl@0
   415
	R4(b,c,d,e,a,74); 
sl@0
   416
	R4(a,b,c,d,e,75);
sl@0
   417
    R4(e,a,b,c,d,76); 
sl@0
   418
	R4(d,e,a,b,c,77); 
sl@0
   419
	R4(c,d,e,a,b,78); 
sl@0
   420
	R4(b,c,d,e,a,79);
sl@0
   421
    
sl@0
   422
	/* Add the working vars back into context.state[] */
sl@0
   423
    iA += a;
sl@0
   424
    iB += b;
sl@0
   425
    iC += c;
sl@0
   426
    iD += d;
sl@0
   427
    iE += e;
sl@0
   428
    /* Wipe variables */
sl@0
   429
    a = b = c = d = e = 0;
sl@0
   430
	Mem::FillZ(W, sizeof(W));
sl@0
   431
#else
sl@0
   432
	TUint tempA=iA;
sl@0
   433
	TUint tempB=iB;
sl@0
   434
	TUint tempC=iC;
sl@0
   435
	TUint tempD=iD;
sl@0
   436
	TUint tempE=iE;
sl@0
   437
	TUint temp=0;
sl@0
   438
sl@0
   439
#ifdef EXPANDLOOP
sl@0
   440
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[0]);
sl@0
   441
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[1]);
sl@0
   442
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[2]);
sl@0
   443
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[3]);
sl@0
   444
	CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[4]);
sl@0
   445
	CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[5]);
sl@0
   446
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[6]);
sl@0
   447
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[7]);
sl@0
   448
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[8]);
sl@0
   449
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[9]);
sl@0
   450
	CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[10]);
sl@0
   451
	CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[11]);
sl@0
   452
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[12]);
sl@0
   453
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[13]);
sl@0
   454
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[14]);
sl@0
   455
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[15]);
sl@0
   456
	/*
sl@0
   457
	i = 16;
sl@0
   458
	TUint temp1 = tempA;
sl@0
   459
	tempA = 
sl@0
   460
	*/
sl@0
   461
#else
sl@0
   462
    TUint i=0;
sl@0
   463
	while (i<16) 
sl@0
   464
		{
sl@0
   465
		temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999;
sl@0
   466
		tempE = tempD;
sl@0
   467
		tempD = tempC;
sl@0
   468
		tempC = CMD_R(tempB,30);
sl@0
   469
		tempB = tempA;
sl@0
   470
		tempA = temp;
sl@0
   471
		}
sl@0
   472
#endif
sl@0
   473
sl@0
   474
#ifdef EXPANDLOOP
sl@0
   475
	CSHA1_20(tempC,tempD,tempE,temp,tempA,tempB,iData[16],iData[13],iData[8],iData[2],iData[0]);
sl@0
   476
	CSHA1_20(tempB,tempC,tempD,tempE,temp,tempA,iData[17],iData[14],iData[9],iData[3],iData[1]);
sl@0
   477
	CSHA1_20(tempA,tempB,tempC,tempD,tempE,temp,iData[18],iData[15],iData[10],iData[4],iData[2]);
sl@0
   478
	CSHA1_20(temp,tempA,tempB,tempC,tempD,tempE,iData[19],iData[16],iData[11],iData[5],iData[3]);
sl@0
   479
	//i = 20;
sl@0
   480
#else
sl@0
   481
	while (i<20) 
sl@0
   482
		{
sl@0
   483
		temp=iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   484
		iData[i]=CMD_R(temp,1);
sl@0
   485
		temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999; 
sl@0
   486
		tempE = tempD;
sl@0
   487
		tempD = tempC; 
sl@0
   488
		tempC = CMD_R(tempB,30); 
sl@0
   489
		tempB = tempA; 
sl@0
   490
		tempA = temp;
sl@0
   491
		}
sl@0
   492
#endif
sl@0
   493
sl@0
   494
#ifdef EXPANDLOOP
sl@0
   495
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[20],iData[17],iData[12],iData[6],iData[4]);
sl@0
   496
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[21],iData[18],iData[13],iData[7],iData[5]);
sl@0
   497
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[22],iData[19],iData[14],iData[8],iData[6]);
sl@0
   498
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[23],iData[20],iData[15],iData[9],iData[7]);
sl@0
   499
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[24],iData[21],iData[16],iData[10],iData[8]);
sl@0
   500
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[25],iData[22],iData[17],iData[11],iData[9]);
sl@0
   501
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[26],iData[23],iData[18],iData[12],iData[10]);
sl@0
   502
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[27],iData[24],iData[19],iData[13],iData[11]);
sl@0
   503
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[28],iData[25],iData[20],iData[14],iData[12]);
sl@0
   504
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[29],iData[26],iData[21],iData[15],iData[13]);
sl@0
   505
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[30],iData[27],iData[22],iData[16],iData[14]);
sl@0
   506
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[31],iData[28],iData[23],iData[17],iData[15]);
sl@0
   507
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[32],iData[29],iData[24],iData[18],iData[16]);
sl@0
   508
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[33],iData[30],iData[25],iData[19],iData[17]);
sl@0
   509
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[34],iData[31],iData[26],iData[20],iData[18]);
sl@0
   510
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[35],iData[32],iData[27],iData[21],iData[19]);
sl@0
   511
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[36],iData[33],iData[28],iData[22],iData[20]);
sl@0
   512
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[37],iData[34],iData[29],iData[23],iData[21]);
sl@0
   513
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[38],iData[35],iData[30],iData[24],iData[22]);
sl@0
   514
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[39],iData[36],iData[31],iData[25],iData[23]);
sl@0
   515
	//i = 40;
sl@0
   516
#else
sl@0
   517
	while (i<40) 
sl@0
   518
		{
sl@0
   519
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   520
		iData[i] = CMD_R(temp,1);
sl@0
   521
sl@0
   522
		temp = CMD_R(tempA,5) + CSHA1_G(tempB,tempC,tempD) + tempE + iData[i++] + 0x6ed9eba1; 
sl@0
   523
		tempE = tempD; 
sl@0
   524
		tempD = tempC; 
sl@0
   525
		tempC = CMD_R(tempB,30); 
sl@0
   526
		tempB = tempA; 
sl@0
   527
		tempA = temp;
sl@0
   528
		}
sl@0
   529
#endif
sl@0
   530
sl@0
   531
#ifdef EXPANDLOOP
sl@0
   532
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[40],iData[37],iData[32],iData[26],iData[24]);
sl@0
   533
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[41],iData[38],iData[33],iData[27],iData[25]);
sl@0
   534
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[42],iData[39],iData[34],iData[28],iData[26]);
sl@0
   535
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[43],iData[40],iData[35],iData[29],iData[27]);
sl@0
   536
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[44],iData[41],iData[36],iData[30],iData[28]);
sl@0
   537
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[45],iData[42],iData[37],iData[31],iData[29]);
sl@0
   538
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[46],iData[43],iData[38],iData[32],iData[30]);
sl@0
   539
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[47],iData[44],iData[39],iData[33],iData[31]);
sl@0
   540
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[48],iData[45],iData[40],iData[34],iData[32]);
sl@0
   541
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[49],iData[46],iData[41],iData[35],iData[33]);
sl@0
   542
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[50],iData[47],iData[42],iData[36],iData[34]);
sl@0
   543
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[51],iData[48],iData[43],iData[37],iData[35]);
sl@0
   544
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[52],iData[49],iData[44],iData[38],iData[36]);
sl@0
   545
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[53],iData[50],iData[45],iData[39],iData[37]);
sl@0
   546
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[54],iData[51],iData[46],iData[40],iData[38]);
sl@0
   547
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[55],iData[52],iData[47],iData[41],iData[39]);
sl@0
   548
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[56],iData[53],iData[48],iData[42],iData[40]);
sl@0
   549
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[57],iData[54],iData[49],iData[43],iData[41]);
sl@0
   550
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[58],iData[55],iData[50],iData[44],iData[42]);
sl@0
   551
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[59],iData[56],iData[51],iData[45],iData[43]);
sl@0
   552
	//i = 60;
sl@0
   553
#else
sl@0
   554
	while (i<60) 
sl@0
   555
		{
sl@0
   556
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   557
		iData[i] = CMD_R(temp,1);
sl@0
   558
sl@0
   559
		temp = CMD_R(tempA,5) + CSHA1_H(tempB,tempC,tempD) + tempE + iData[i++] + 0x8f1bbcdc; 
sl@0
   560
		tempE = tempD; 
sl@0
   561
		tempD = tempC; 
sl@0
   562
		tempC = CMD_R(tempB,30); 
sl@0
   563
		tempB = tempA; 
sl@0
   564
		tempA = temp;
sl@0
   565
		}
sl@0
   566
#endif
sl@0
   567
sl@0
   568
#ifdef EXPANDLOOP
sl@0
   569
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[60],iData[57],iData[52],iData[46],iData[44]);
sl@0
   570
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[61],iData[58],iData[53],iData[47],iData[45]);
sl@0
   571
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[62],iData[59],iData[54],iData[48],iData[46]);
sl@0
   572
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[63],iData[60],iData[55],iData[49],iData[47]);
sl@0
   573
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[64],iData[61],iData[56],iData[50],iData[48]);
sl@0
   574
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[65],iData[62],iData[57],iData[51],iData[49]);
sl@0
   575
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[66],iData[63],iData[58],iData[52],iData[50]);
sl@0
   576
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[67],iData[64],iData[59],iData[53],iData[51]);
sl@0
   577
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[68],iData[65],iData[60],iData[54],iData[52]);
sl@0
   578
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[69],iData[66],iData[61],iData[55],iData[53]);
sl@0
   579
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[70],iData[67],iData[62],iData[56],iData[54]);
sl@0
   580
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[71],iData[68],iData[63],iData[57],iData[55]);
sl@0
   581
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[72],iData[69],iData[64],iData[58],iData[56]);
sl@0
   582
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[73],iData[70],iData[65],iData[59],iData[57]);
sl@0
   583
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[74],iData[71],iData[66],iData[60],iData[58]);
sl@0
   584
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[75],iData[72],iData[67],iData[61],iData[59]);
sl@0
   585
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[76],iData[73],iData[68],iData[62],iData[60]);
sl@0
   586
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[77],iData[74],iData[69],iData[63],iData[61]);
sl@0
   587
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[78],iData[75],iData[70],iData[64],iData[62]);
sl@0
   588
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[79],iData[76],iData[71],iData[65],iData[63]);
sl@0
   589
#else
sl@0
   590
	const TUint total=KSHA1BlockSize*5; // 16 * 5 = 80
sl@0
   591
	while (i<total) 
sl@0
   592
		{
sl@0
   593
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   594
		iData[i] = CMD_R(temp,1);
sl@0
   595
sl@0
   596
		temp = CMD_R(tempA,5) + CSHA1_I(tempB,tempC,tempD) + tempE + iData[i++] + 0xca62c1d6; 
sl@0
   597
		tempE = tempD; 
sl@0
   598
		tempD = tempC; 
sl@0
   599
		tempC = CMD_R(tempB,30); 
sl@0
   600
		tempB = tempA; 
sl@0
   601
		tempA = temp;
sl@0
   602
		}
sl@0
   603
#endif
sl@0
   604
sl@0
   605
#ifdef EXPANDLOOP
sl@0
   606
	iA+=tempE;
sl@0
   607
	iB+=temp;
sl@0
   608
	iC+=tempA;
sl@0
   609
	iD+=tempB;
sl@0
   610
	iE+=tempC;
sl@0
   611
#else
sl@0
   612
	iA+=tempA;
sl@0
   613
	iB+=tempB;
sl@0
   614
	iC+=tempC;
sl@0
   615
	iD+=tempD;
sl@0
   616
	iE+=tempE;
sl@0
   617
#endif // EXPANDLOOP
sl@0
   618
#endif // WEIDAI
sl@0
   619
	}
sl@0
   620
sl@0
   621
void CSHA1Impl::DoFinal()
sl@0
   622
	{
sl@0
   623
	iNh += iNl;
sl@0
   624
	const TUint ul128=128;
sl@0
   625
	switch (iNl&3) 
sl@0
   626
		{
sl@0
   627
		case 0:
sl@0
   628
			iData[iNl>>2] = ul128<<24;
sl@0
   629
			break;
sl@0
   630
		case 1:
sl@0
   631
			iData[iNl>>2] += ul128<<16;
sl@0
   632
			break;
sl@0
   633
		case 2:
sl@0
   634
			iData[iNl>>2] += ul128<<8;
sl@0
   635
			break;
sl@0
   636
		case 3:
sl@0
   637
			iData[iNl>>2] += ul128;
sl@0
   638
			break;
sl@0
   639
		default:
sl@0
   640
			break;
sl@0
   641
		};
sl@0
   642
	if (iNl>=56) 
sl@0
   643
		{
sl@0
   644
		if (iNl<60)
sl@0
   645
			iData[15]=0;		
sl@0
   646
		Block();
sl@0
   647
		Mem::FillZ(iData,14*sizeof(TUint));
sl@0
   648
		} 
sl@0
   649
	else
sl@0
   650
		{
sl@0
   651
		const TUint offset=(iNl+4)>>2; //+4 to account for the word added in the
sl@0
   652
		//switch statement above
sl@0
   653
		Mem::FillZ(iData+offset,(14-offset)*sizeof(TUint));
sl@0
   654
		}
sl@0
   655
sl@0
   656
	// this will fail if the total input length is longer than 2^32 in bits
sl@0
   657
	//(2^31 in bytes) which is roughly half a gig.
sl@0
   658
	iData[14]=0;
sl@0
   659
	iData[15]=iNh<<3;//number in bits
sl@0
   660
	Block();
sl@0
   661
	//
sl@0
   662
	// Generate hash value into iHash
sl@0
   663
	//
sl@0
   664
	TUint tmp=iA;
sl@0
   665
	iHash[3]=(TUint8)(tmp & 255);
sl@0
   666
	iHash[2]=(TUint8)((tmp >>= 8) & 255);
sl@0
   667
	iHash[1]=(TUint8)((tmp >>= 8) & 255);
sl@0
   668
	iHash[0]=(TUint8)((tmp >>= 8) & 255);
sl@0
   669
sl@0
   670
	tmp=iB;
sl@0
   671
	iHash[7]=(TUint8)(tmp & 255);
sl@0
   672
	iHash[6]=(TUint8)((tmp >>= 8) & 255);
sl@0
   673
	iHash[5]=(TUint8)((tmp >>= 8) & 255);
sl@0
   674
	iHash[4]=(TUint8)((tmp >>= 8) & 255);
sl@0
   675
sl@0
   676
	tmp=iC;
sl@0
   677
	iHash[11]=(TUint8)(tmp & 255);
sl@0
   678
	iHash[10]=(TUint8)((tmp >>= 8) & 255);
sl@0
   679
	iHash[9]=(TUint8)((tmp >>= 8) & 255);
sl@0
   680
	iHash[8]=(TUint8)((tmp >>= 8) & 255);
sl@0
   681
sl@0
   682
	tmp=iD;
sl@0
   683
	iHash[15]=(TUint8)(tmp & 255);
sl@0
   684
	iHash[14]=(TUint8)((tmp >>= 8) & 255);
sl@0
   685
	iHash[13]=(TUint8)((tmp >>= 8) & 255);
sl@0
   686
	iHash[12]=(TUint8)((tmp >>= 8) & 255);
sl@0
   687
	
sl@0
   688
	tmp=iE;
sl@0
   689
	iHash[19]=(TUint8)(tmp & 255);
sl@0
   690
	iHash[18]=(TUint8)((tmp >>= 8) & 255);
sl@0
   691
	iHash[17]=(TUint8)((tmp >>= 8) & 255);
sl@0
   692
	iHash[16]=(TUint8)((tmp >>= 8) & 255);
sl@0
   693
	}
sl@0
   694
sl@0
   695
void CSHA1Impl::RestoreState()
sl@0
   696
	{
sl@0
   697
	iA = iACopy;
sl@0
   698
	iB = iBCopy;
sl@0
   699
	iC = iCCopy;
sl@0
   700
	iD = iDCopy;
sl@0
   701
	iE = iECopy;
sl@0
   702
	iNl = iNlCopy;
sl@0
   703
	iNh = iNhCopy;	
sl@0
   704
	Mem::Copy(&iData[0], &iDataCopy[0], KSHA1BlockSize*5*sizeof(TUint)); 
sl@0
   705
	}
sl@0
   706
sl@0
   707
void CSHA1Impl::StoreState()
sl@0
   708
	{
sl@0
   709
	iACopy = iA;
sl@0
   710
	iBCopy = iB;
sl@0
   711
	iCCopy = iC;
sl@0
   712
	iDCopy = iD;
sl@0
   713
	iECopy = iE;
sl@0
   714
	iNlCopy = iNl;
sl@0
   715
	iNhCopy = iNh;	
sl@0
   716
	Mem::Copy(&iDataCopy[0], &iData[0], KSHA1BlockSize*5*sizeof(TUint));
sl@0
   717
	}
sl@0
   718
sl@0
   719
// Implemented in hmacimpl.cpp or softwarehashbase.cpp
sl@0
   720
// but required as derived from MHash. No coverage here.
sl@0
   721
#ifdef _BullseyeCoverage
sl@0
   722
#pragma suppress_warnings on
sl@0
   723
#pragma BullseyeCoverage off
sl@0
   724
#pragma suppress_warnings off
sl@0
   725
#endif
sl@0
   726
sl@0
   727
TAny* CSHA1Impl::GetExtension(TUid /*aExtensionId*/)
sl@0
   728
	{
sl@0
   729
	return NULL;	
sl@0
   730
	}
sl@0
   731
sl@0
   732
void CSHA1Impl::SetOperationModeL(TUid /*aOperationMode*/)
sl@0
   733
	{
sl@0
   734
	User::Leave(KErrNotSupported);
sl@0
   735
	}
sl@0
   736
sl@0
   737
void CSHA1Impl::SetKeyL(const CKey& /*aKey*/)
sl@0
   738
	{
sl@0
   739
	User::Leave(KErrNotSupported);
sl@0
   740
	}
sl@0
   741