os/kernelhwsrv/kerneltest/f32test/loader/security/t_sfhash.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
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// f32test\loader\security\t_sfhash.cpp
sl@0
    15
// 
sl@0
    16
//
sl@0
    17
sl@0
    18
#include "t_hash.h"
sl@0
    19
#define EXPANDLOOP
sl@0
    20
sl@0
    21
sl@0
    22
static inline TUint CMD_R(TUint a,TUint s)
sl@0
    23
	{
sl@0
    24
	return (a<<s) | (a>>(32-s));
sl@0
    25
	}
sl@0
    26
sl@0
    27
CSHA1::CSHA1(void)
sl@0
    28
: iHash(SHA1_HASH)
sl@0
    29
	{
sl@0
    30
	}
sl@0
    31
sl@0
    32
CSHA1* CSHA1::NewL(void)
sl@0
    33
	{
sl@0
    34
	CSHA1* self=new(ELeave) CSHA1;
sl@0
    35
	self->Reset();
sl@0
    36
	return self;
sl@0
    37
	}
sl@0
    38
sl@0
    39
void CSHA1::Update(const TDesC8& aMessage)
sl@0
    40
	{
sl@0
    41
	DoUpdate(aMessage.Ptr(),aMessage.Size());
sl@0
    42
	}
sl@0
    43
sl@0
    44
TPtrC8 CSHA1::Final()
sl@0
    45
	{
sl@0
    46
	TPtrC8 ptr(KNullDesC8());
sl@0
    47
	DoFinal();
sl@0
    48
	ptr.Set(iHash);
sl@0
    49
	Reset();
sl@0
    50
	return ptr;
sl@0
    51
	}
sl@0
    52
sl@0
    53
CSHA1::~CSHA1(void)
sl@0
    54
	{
sl@0
    55
	}
sl@0
    56
sl@0
    57
void CSHA1::Reset(void)
sl@0
    58
	{
sl@0
    59
	iA=0x67452301;
sl@0
    60
	iB=0xefcdab89;
sl@0
    61
	iC=0x98badcfe;
sl@0
    62
	iD=0x10325476;
sl@0
    63
	iE=0xc3d2e1f0;
sl@0
    64
	iNh=0;
sl@0
    65
	iNl=0;
sl@0
    66
	}
sl@0
    67
sl@0
    68
// This assumes a big-endian architecture
sl@0
    69
void CSHA1::DoUpdate(const TUint8* aData,TUint aLength)
sl@0
    70
	{
sl@0
    71
	while((aLength / 4) > 0 && (iNl % 4 == 0))
sl@0
    72
		{
sl@0
    73
		iData[iNl>>2] = aData[0] << 24 | aData[1] << 16 | aData[2] << 8 | aData[3];
sl@0
    74
		iNl+=4;
sl@0
    75
		aData+=4;
sl@0
    76
		aLength-=4;
sl@0
    77
		if(iNl==64) 
sl@0
    78
			{
sl@0
    79
			Block();
sl@0
    80
			iNh+=64;
sl@0
    81
			iNl=0;
sl@0
    82
			}
sl@0
    83
		}
sl@0
    84
sl@0
    85
	while(aLength--)
sl@0
    86
		{
sl@0
    87
		switch (iNl&3) 
sl@0
    88
			{
sl@0
    89
			case 0:
sl@0
    90
				iData[iNl>>2]=((TUint)(*aData))<<24;
sl@0
    91
				break;
sl@0
    92
			case 1:
sl@0
    93
				iData[iNl>>2]|=((TUint)(*aData))<<16;
sl@0
    94
				break;
sl@0
    95
			case 2:
sl@0
    96
				iData[iNl>>2]|=((TUint)(*aData))<<8;
sl@0
    97
				break;
sl@0
    98
			case 3:
sl@0
    99
				iData[iNl>>2]|=((TUint)(*aData));
sl@0
   100
				break;
sl@0
   101
			default:
sl@0
   102
				break;
sl@0
   103
			};
sl@0
   104
			aData++;
sl@0
   105
			iNl++;
sl@0
   106
			if(iNl==64) 
sl@0
   107
				{
sl@0
   108
				Block();
sl@0
   109
				iNh+=64;
sl@0
   110
				iNl=0;
sl@0
   111
				}
sl@0
   112
		}
sl@0
   113
	}
sl@0
   114
sl@0
   115
static inline TUint CSHA1_F(const TUint x,const TUint y,const TUint z)
sl@0
   116
	{
sl@0
   117
	return (x&y) | (~x&z);
sl@0
   118
	}
sl@0
   119
sl@0
   120
static inline TUint CSHA1_G(const TUint x,const TUint y,const TUint z)
sl@0
   121
	{
sl@0
   122
	return x^y^z;
sl@0
   123
	}
sl@0
   124
sl@0
   125
static inline TUint CSHA1_H(const TUint x,const TUint y,const TUint z)
sl@0
   126
	{
sl@0
   127
	return (x&y) | (x&z) | (y&z);
sl@0
   128
	}
sl@0
   129
sl@0
   130
/*static inline TUint CSHA1_I(const TUint x,const TUint y,const TUint z)
sl@0
   131
	{
sl@0
   132
	return x^y^z;
sl@0
   133
	}*/
sl@0
   134
sl@0
   135
#ifdef EXPANDLOOP
sl@0
   136
sl@0
   137
#ifdef MACRO
sl@0
   138
sl@0
   139
#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
   140
												y=CMD_R(y,30);t=v;
sl@0
   141
#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
   142
												CSHA1_16(x,y,z,u,t,v,w0);
sl@0
   143
#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
   144
												v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0x6ed9eba1;\
sl@0
   145
												y=CMD_R(y,30);t=v;
sl@0
   146
#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
   147
												v=CMD_R(x,5)+CSHA1_H(y,z,u)+t+w0+0x8f1bbcdc;\
sl@0
   148
												y=CMD_R(y,30);t=v;
sl@0
   149
#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
   150
												v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0xca62c1d6;\
sl@0
   151
												y=CMD_R(y,30);t=v;
sl@0
   152
#else
sl@0
   153
sl@0
   154
static inline void CSHA1_16(const TUint x, TUint& y, const TUint z,
sl@0
   155
							const TUint u, TUint& t, TUint& v, const TUint w)
sl@0
   156
	{
sl@0
   157
	v = CMD_R(x,5) + CSHA1_F(y,z,u) + t + w + 0x5a827999;
sl@0
   158
	y = CMD_R(y,30);
sl@0
   159
	t = v;
sl@0
   160
	}
sl@0
   161
sl@0
   162
static inline void CSHA1_20(const TUint x,TUint& y,const TUint z,
sl@0
   163
							const TUint u,TUint& t,TUint& v,
sl@0
   164
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   165
							const TUint w14,const TUint w16)
sl@0
   166
	{
sl@0
   167
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   168
	w0 = CMD_R(v,1);
sl@0
   169
	CSHA1_16(x,y,z,u,t,v,w0);
sl@0
   170
	}
sl@0
   171
sl@0
   172
static inline void CSHA1_40(const TUint x,TUint& y,const TUint z,
sl@0
   173
							const TUint u,TUint& t,TUint& v,
sl@0
   174
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   175
							const TUint w14,const TUint w16)
sl@0
   176
	{
sl@0
   177
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   178
	w0 = CMD_R(v,1);
sl@0
   179
	v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0x6ed9eba1;
sl@0
   180
	y = CMD_R(y,30);
sl@0
   181
	t = v;
sl@0
   182
	}
sl@0
   183
sl@0
   184
static inline void CSHA1_60(const TUint x,TUint& y,const TUint z,
sl@0
   185
							const TUint u,TUint& t,TUint& v,
sl@0
   186
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   187
							const TUint w14,const TUint w16)
sl@0
   188
	{
sl@0
   189
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   190
	w0 = CMD_R(v,1);
sl@0
   191
	v = CMD_R(x,5) + CSHA1_H(y,z,u) + t + w0 + 0x8f1bbcdc;
sl@0
   192
	y = CMD_R(y,30);
sl@0
   193
	t = v;
sl@0
   194
	}
sl@0
   195
sl@0
   196
static inline void CSHA1_80(const TUint x,TUint& y,const TUint z,
sl@0
   197
							const TUint u,TUint& t,TUint& v,
sl@0
   198
							TUint& w0,const TUint w3,const TUint w8,
sl@0
   199
							const TUint w14,const TUint w16)
sl@0
   200
	{
sl@0
   201
	v = w3 ^ w8 ^ w14 ^ w16;
sl@0
   202
	w0 = CMD_R(v,1);
sl@0
   203
	v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0xca62c1d6;
sl@0
   204
	y = CMD_R(y,30);
sl@0
   205
	t = v;
sl@0
   206
	}
sl@0
   207
sl@0
   208
#endif // MACRO
sl@0
   209
#endif // EXPANDLOOP
sl@0
   210
sl@0
   211
#ifdef WEIDAI
sl@0
   212
sl@0
   213
template <class T> inline T rotlFixed(T x, unsigned int y)
sl@0
   214
{
sl@0
   215
	ASSERT(y < sizeof(T)*8);
sl@0
   216
	return (x<<y) | (x>>(sizeof(T)*8-y));
sl@0
   217
}
sl@0
   218
sl@0
   219
template<> inline TUint32 rotlFixed<TUint32>(TUint32 x, unsigned int y)
sl@0
   220
{
sl@0
   221
	ASSERT(y < 32);
sl@0
   222
	return y ? CMD_R(x, y) : x;
sl@0
   223
}
sl@0
   224
sl@0
   225
#define blk0(i) (W[i] = iData[i])
sl@0
   226
#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
   227
sl@0
   228
#define f1(x,y,z) (z^(x&(y^z)))
sl@0
   229
#define f2(x,y,z) (x^y^z)
sl@0
   230
#define f3(x,y,z) ((x&y)|(z&(x|y)))
sl@0
   231
#define f4(x,y,z) (x^y^z)
sl@0
   232
sl@0
   233
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
sl@0
   234
#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
   235
#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
   236
#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
   237
#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
   238
#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
   239
sl@0
   240
#endif // WEIDAI
sl@0
   241
sl@0
   242
void CSHA1::Block()
sl@0
   243
	{
sl@0
   244
#ifdef WEIDAI
sl@0
   245
	TUint32 W[16];
sl@0
   246
    /* Copy context->state[] to working vars */
sl@0
   247
    TUint32 a = iA;
sl@0
   248
    TUint32 b = iB;
sl@0
   249
    TUint32 c = iC;
sl@0
   250
    TUint32 d = iD;
sl@0
   251
    TUint32 e = iE;
sl@0
   252
    
sl@0
   253
	/* 4 rounds of 20 operations each. Loop unrolled. */
sl@0
   254
    
sl@0
   255
	R0(a,b,c,d,e, 0); 
sl@0
   256
	R0(e,a,b,c,d, 1); 
sl@0
   257
	R0(d,e,a,b,c, 2); 
sl@0
   258
	R0(c,d,e,a,b, 3);
sl@0
   259
    R0(b,c,d,e,a, 4); 
sl@0
   260
	R0(a,b,c,d,e, 5); 
sl@0
   261
	R0(e,a,b,c,d, 6); 
sl@0
   262
	R0(d,e,a,b,c, 7);
sl@0
   263
    R0(c,d,e,a,b, 8); 
sl@0
   264
	R0(b,c,d,e,a, 9); 
sl@0
   265
	R0(a,b,c,d,e,10); 
sl@0
   266
	R0(e,a,b,c,d,11);
sl@0
   267
    R0(d,e,a,b,c,12); 
sl@0
   268
	R0(c,d,e,a,b,13); 
sl@0
   269
	R0(b,c,d,e,a,14); 
sl@0
   270
	R0(a,b,c,d,e,15);
sl@0
   271
sl@0
   272
    R1(e,a,b,c,d,16); 
sl@0
   273
	R1(d,e,a,b,c,17); 
sl@0
   274
	R1(c,d,e,a,b,18); 
sl@0
   275
	R1(b,c,d,e,a,19);
sl@0
   276
sl@0
   277
    R2(a,b,c,d,e,20); 
sl@0
   278
	R2(e,a,b,c,d,21); 
sl@0
   279
	R2(d,e,a,b,c,22); 
sl@0
   280
	R2(c,d,e,a,b,23);
sl@0
   281
    R2(b,c,d,e,a,24); 
sl@0
   282
	R2(a,b,c,d,e,25); 
sl@0
   283
	R2(e,a,b,c,d,26); 
sl@0
   284
	R2(d,e,a,b,c,27);
sl@0
   285
    R2(c,d,e,a,b,28); 
sl@0
   286
	R2(b,c,d,e,a,29); 
sl@0
   287
	R2(a,b,c,d,e,30); 
sl@0
   288
	R2(e,a,b,c,d,31);
sl@0
   289
    R2(d,e,a,b,c,32); 
sl@0
   290
	R2(c,d,e,a,b,33); 
sl@0
   291
	R2(b,c,d,e,a,34); 
sl@0
   292
	R2(a,b,c,d,e,35);
sl@0
   293
    R2(e,a,b,c,d,36); 
sl@0
   294
	R2(d,e,a,b,c,37); 
sl@0
   295
	R2(c,d,e,a,b,38); 
sl@0
   296
	R2(b,c,d,e,a,39);
sl@0
   297
sl@0
   298
    R3(a,b,c,d,e,40); 
sl@0
   299
	R3(e,a,b,c,d,41); 
sl@0
   300
	R3(d,e,a,b,c,42); 
sl@0
   301
	R3(c,d,e,a,b,43);
sl@0
   302
    R3(b,c,d,e,a,44); 
sl@0
   303
	R3(a,b,c,d,e,45); 
sl@0
   304
	R3(e,a,b,c,d,46); 
sl@0
   305
	R3(d,e,a,b,c,47);
sl@0
   306
    R3(c,d,e,a,b,48); 
sl@0
   307
	R3(b,c,d,e,a,49); 
sl@0
   308
	R3(a,b,c,d,e,50); 
sl@0
   309
	R3(e,a,b,c,d,51);
sl@0
   310
    R3(d,e,a,b,c,52); 
sl@0
   311
	R3(c,d,e,a,b,53); 
sl@0
   312
	R3(b,c,d,e,a,54); 
sl@0
   313
	R3(a,b,c,d,e,55);
sl@0
   314
    R3(e,a,b,c,d,56); 
sl@0
   315
	R3(d,e,a,b,c,57); 
sl@0
   316
	R3(c,d,e,a,b,58); 
sl@0
   317
	R3(b,c,d,e,a,59);
sl@0
   318
sl@0
   319
    R4(a,b,c,d,e,60); 
sl@0
   320
	R4(e,a,b,c,d,61); 
sl@0
   321
	R4(d,e,a,b,c,62); 
sl@0
   322
	R4(c,d,e,a,b,63);
sl@0
   323
    R4(b,c,d,e,a,64); 
sl@0
   324
	R4(a,b,c,d,e,65); 
sl@0
   325
	R4(e,a,b,c,d,66); 
sl@0
   326
	R4(d,e,a,b,c,67);
sl@0
   327
    R4(c,d,e,a,b,68); 
sl@0
   328
	R4(b,c,d,e,a,69); 
sl@0
   329
	R4(a,b,c,d,e,70); 
sl@0
   330
	R4(e,a,b,c,d,71);
sl@0
   331
    R4(d,e,a,b,c,72); 
sl@0
   332
	R4(c,d,e,a,b,73); 
sl@0
   333
	R4(b,c,d,e,a,74); 
sl@0
   334
	R4(a,b,c,d,e,75);
sl@0
   335
    R4(e,a,b,c,d,76); 
sl@0
   336
	R4(d,e,a,b,c,77); 
sl@0
   337
	R4(c,d,e,a,b,78); 
sl@0
   338
	R4(b,c,d,e,a,79);
sl@0
   339
    
sl@0
   340
	/* Add the working vars back into context.state[] */
sl@0
   341
    iA += a;
sl@0
   342
    iB += b;
sl@0
   343
    iC += c;
sl@0
   344
    iD += d;
sl@0
   345
    iE += e;
sl@0
   346
    /* Wipe variables */
sl@0
   347
    a = b = c = d = e = 0;
sl@0
   348
	Mem::FillZ(W, sizeof(W));
sl@0
   349
#else
sl@0
   350
	TUint tempA=iA;
sl@0
   351
	TUint tempB=iB;
sl@0
   352
	TUint tempC=iC;
sl@0
   353
	TUint tempD=iD;
sl@0
   354
	TUint tempE=iE;
sl@0
   355
	TUint temp=0;
sl@0
   356
sl@0
   357
#ifdef EXPANDLOOP
sl@0
   358
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[0]);
sl@0
   359
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[1]);
sl@0
   360
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[2]);
sl@0
   361
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[3]);
sl@0
   362
	CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[4]);
sl@0
   363
	CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[5]);
sl@0
   364
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[6]);
sl@0
   365
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[7]);
sl@0
   366
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[8]);
sl@0
   367
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[9]);
sl@0
   368
	CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[10]);
sl@0
   369
	CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[11]);
sl@0
   370
	CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[12]);
sl@0
   371
	CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[13]);
sl@0
   372
	CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[14]);
sl@0
   373
	CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[15]);
sl@0
   374
	/*
sl@0
   375
	i = 16;
sl@0
   376
	TUint temp1 = tempA;
sl@0
   377
	tempA = 
sl@0
   378
	*/
sl@0
   379
#else
sl@0
   380
    TUint i=0;
sl@0
   381
	while (i<16) 
sl@0
   382
		{
sl@0
   383
		temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999;
sl@0
   384
		tempE = tempD;
sl@0
   385
		tempD = tempC;
sl@0
   386
		tempC = CMD_R(tempB,30);
sl@0
   387
		tempB = tempA;
sl@0
   388
		tempA = temp;
sl@0
   389
		}
sl@0
   390
#endif
sl@0
   391
sl@0
   392
#ifdef EXPANDLOOP
sl@0
   393
	CSHA1_20(tempC,tempD,tempE,temp,tempA,tempB,iData[16],iData[13],iData[8],iData[2],iData[0]);
sl@0
   394
	CSHA1_20(tempB,tempC,tempD,tempE,temp,tempA,iData[17],iData[14],iData[9],iData[3],iData[1]);
sl@0
   395
	CSHA1_20(tempA,tempB,tempC,tempD,tempE,temp,iData[18],iData[15],iData[10],iData[4],iData[2]);
sl@0
   396
	CSHA1_20(temp,tempA,tempB,tempC,tempD,tempE,iData[19],iData[16],iData[11],iData[5],iData[3]);
sl@0
   397
	//i = 20;
sl@0
   398
#else
sl@0
   399
	while (i<20) 
sl@0
   400
		{
sl@0
   401
		temp=iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   402
		iData[i]=CMD_R(temp,1);
sl@0
   403
		temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999; 
sl@0
   404
		tempE = tempD;
sl@0
   405
		tempD = tempC; 
sl@0
   406
		tempC = CMD_R(tempB,30); 
sl@0
   407
		tempB = tempA; 
sl@0
   408
		tempA = temp;
sl@0
   409
		}
sl@0
   410
#endif
sl@0
   411
sl@0
   412
#ifdef EXPANDLOOP
sl@0
   413
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[20],iData[17],iData[12],iData[6],iData[4]);
sl@0
   414
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[21],iData[18],iData[13],iData[7],iData[5]);
sl@0
   415
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[22],iData[19],iData[14],iData[8],iData[6]);
sl@0
   416
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[23],iData[20],iData[15],iData[9],iData[7]);
sl@0
   417
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[24],iData[21],iData[16],iData[10],iData[8]);
sl@0
   418
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[25],iData[22],iData[17],iData[11],iData[9]);
sl@0
   419
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[26],iData[23],iData[18],iData[12],iData[10]);
sl@0
   420
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[27],iData[24],iData[19],iData[13],iData[11]);
sl@0
   421
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[28],iData[25],iData[20],iData[14],iData[12]);
sl@0
   422
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[29],iData[26],iData[21],iData[15],iData[13]);
sl@0
   423
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[30],iData[27],iData[22],iData[16],iData[14]);
sl@0
   424
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[31],iData[28],iData[23],iData[17],iData[15]);
sl@0
   425
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[32],iData[29],iData[24],iData[18],iData[16]);
sl@0
   426
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[33],iData[30],iData[25],iData[19],iData[17]);
sl@0
   427
	CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[34],iData[31],iData[26],iData[20],iData[18]);
sl@0
   428
	CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[35],iData[32],iData[27],iData[21],iData[19]);
sl@0
   429
	CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[36],iData[33],iData[28],iData[22],iData[20]);
sl@0
   430
	CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[37],iData[34],iData[29],iData[23],iData[21]);
sl@0
   431
	CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[38],iData[35],iData[30],iData[24],iData[22]);
sl@0
   432
	CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[39],iData[36],iData[31],iData[25],iData[23]);
sl@0
   433
	//i = 40;
sl@0
   434
#else
sl@0
   435
	while (i<40) 
sl@0
   436
		{
sl@0
   437
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   438
		iData[i] = CMD_R(temp,1);
sl@0
   439
sl@0
   440
		temp = CMD_R(tempA,5) + CSHA1_G(tempB,tempC,tempD) + tempE + iData[i++] + 0x6ed9eba1; 
sl@0
   441
		tempE = tempD; 
sl@0
   442
		tempD = tempC; 
sl@0
   443
		tempC = CMD_R(tempB,30); 
sl@0
   444
		tempB = tempA; 
sl@0
   445
		tempA = temp;
sl@0
   446
		}
sl@0
   447
#endif
sl@0
   448
sl@0
   449
#ifdef EXPANDLOOP
sl@0
   450
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[40],iData[37],iData[32],iData[26],iData[24]);
sl@0
   451
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[41],iData[38],iData[33],iData[27],iData[25]);
sl@0
   452
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[42],iData[39],iData[34],iData[28],iData[26]);
sl@0
   453
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[43],iData[40],iData[35],iData[29],iData[27]);
sl@0
   454
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[44],iData[41],iData[36],iData[30],iData[28]);
sl@0
   455
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[45],iData[42],iData[37],iData[31],iData[29]);
sl@0
   456
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[46],iData[43],iData[38],iData[32],iData[30]);
sl@0
   457
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[47],iData[44],iData[39],iData[33],iData[31]);
sl@0
   458
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[48],iData[45],iData[40],iData[34],iData[32]);
sl@0
   459
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[49],iData[46],iData[41],iData[35],iData[33]);
sl@0
   460
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[50],iData[47],iData[42],iData[36],iData[34]);
sl@0
   461
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[51],iData[48],iData[43],iData[37],iData[35]);
sl@0
   462
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[52],iData[49],iData[44],iData[38],iData[36]);
sl@0
   463
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[53],iData[50],iData[45],iData[39],iData[37]);
sl@0
   464
	CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[54],iData[51],iData[46],iData[40],iData[38]);
sl@0
   465
	CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[55],iData[52],iData[47],iData[41],iData[39]);
sl@0
   466
	CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[56],iData[53],iData[48],iData[42],iData[40]);
sl@0
   467
	CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[57],iData[54],iData[49],iData[43],iData[41]);
sl@0
   468
	CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[58],iData[55],iData[50],iData[44],iData[42]);
sl@0
   469
	CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[59],iData[56],iData[51],iData[45],iData[43]);
sl@0
   470
	//i = 60;
sl@0
   471
#else
sl@0
   472
	while (i<60) 
sl@0
   473
		{
sl@0
   474
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   475
		iData[i] = CMD_R(temp,1);
sl@0
   476
sl@0
   477
		temp = CMD_R(tempA,5) + CSHA1_H(tempB,tempC,tempD) + tempE + iData[i++] + 0x8f1bbcdc; 
sl@0
   478
		tempE = tempD; 
sl@0
   479
		tempD = tempC; 
sl@0
   480
		tempC = CMD_R(tempB,30); 
sl@0
   481
		tempB = tempA; 
sl@0
   482
		tempA = temp;
sl@0
   483
		}
sl@0
   484
#endif
sl@0
   485
sl@0
   486
#ifdef EXPANDLOOP
sl@0
   487
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[60],iData[57],iData[52],iData[46],iData[44]);
sl@0
   488
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[61],iData[58],iData[53],iData[47],iData[45]);
sl@0
   489
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[62],iData[59],iData[54],iData[48],iData[46]);
sl@0
   490
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[63],iData[60],iData[55],iData[49],iData[47]);
sl@0
   491
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[64],iData[61],iData[56],iData[50],iData[48]);
sl@0
   492
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[65],iData[62],iData[57],iData[51],iData[49]);
sl@0
   493
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[66],iData[63],iData[58],iData[52],iData[50]);
sl@0
   494
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[67],iData[64],iData[59],iData[53],iData[51]);
sl@0
   495
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[68],iData[65],iData[60],iData[54],iData[52]);
sl@0
   496
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[69],iData[66],iData[61],iData[55],iData[53]);
sl@0
   497
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[70],iData[67],iData[62],iData[56],iData[54]);
sl@0
   498
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[71],iData[68],iData[63],iData[57],iData[55]);
sl@0
   499
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[72],iData[69],iData[64],iData[58],iData[56]);
sl@0
   500
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[73],iData[70],iData[65],iData[59],iData[57]);
sl@0
   501
	CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[74],iData[71],iData[66],iData[60],iData[58]);
sl@0
   502
	CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[75],iData[72],iData[67],iData[61],iData[59]);
sl@0
   503
	CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[76],iData[73],iData[68],iData[62],iData[60]);
sl@0
   504
	CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[77],iData[74],iData[69],iData[63],iData[61]);
sl@0
   505
	CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[78],iData[75],iData[70],iData[64],iData[62]);
sl@0
   506
	CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[79],iData[76],iData[71],iData[65],iData[63]);
sl@0
   507
#else
sl@0
   508
	const TUint total=SHA1_LBLOCK*5; // 16 * 5 = 80
sl@0
   509
	while (i<total) 
sl@0
   510
		{
sl@0
   511
		temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16];
sl@0
   512
		iData[i] = CMD_R(temp,1);
sl@0
   513
sl@0
   514
		temp = CMD_R(tempA,5) + CSHA1_I(tempB,tempC,tempD) + tempE + iData[i++] + 0xca62c1d6; 
sl@0
   515
		tempE = tempD; 
sl@0
   516
		tempD = tempC; 
sl@0
   517
		tempC = CMD_R(tempB,30); 
sl@0
   518
		tempB = tempA; 
sl@0
   519
		tempA = temp;
sl@0
   520
		}
sl@0
   521
#endif
sl@0
   522
sl@0
   523
#ifdef EXPANDLOOP
sl@0
   524
	iA+=tempE;
sl@0
   525
	iB+=temp;
sl@0
   526
	iC+=tempA;
sl@0
   527
	iD+=tempB;
sl@0
   528
	iE+=tempC;
sl@0
   529
#else
sl@0
   530
	iA+=tempA;
sl@0
   531
	iB+=tempB;
sl@0
   532
	iC+=tempC;
sl@0
   533
	iD+=tempD;
sl@0
   534
	iE+=tempE;
sl@0
   535
#endif // EXPANDLOOP
sl@0
   536
#endif // WEIDAI
sl@0
   537
	}
sl@0
   538
sl@0
   539
void CSHA1::DoFinal()
sl@0
   540
	{
sl@0
   541
	iNh += iNl;
sl@0
   542
	const TUint ul128=128;
sl@0
   543
	switch (iNl&3) 
sl@0
   544
		{
sl@0
   545
		case 0:
sl@0
   546
			iData[iNl>>2] = ul128<<24;
sl@0
   547
			break;
sl@0
   548
		case 1:
sl@0
   549
			iData[iNl>>2] += ul128<<16;
sl@0
   550
			break;
sl@0
   551
		case 2:
sl@0
   552
			iData[iNl>>2] += ul128<<8;
sl@0
   553
			break;
sl@0
   554
		case 3:
sl@0
   555
			iData[iNl>>2] += ul128;
sl@0
   556
			break;
sl@0
   557
		default:
sl@0
   558
			break;
sl@0
   559
		};
sl@0
   560
	if (iNl>=56) 
sl@0
   561
		{
sl@0
   562
		if (iNl<60)
sl@0
   563
			iData[15]=0;		
sl@0
   564
		Block();
sl@0
   565
		Mem::FillZ(iData,14*sizeof(TUint));
sl@0
   566
		} 
sl@0
   567
	else
sl@0
   568
		{
sl@0
   569
		const TUint offset=(iNl+4)>>2; //+4 to account for the word added in the
sl@0
   570
		//switch statement above
sl@0
   571
		Mem::FillZ(iData+offset,(14-offset)*sizeof(TUint));
sl@0
   572
		}
sl@0
   573
sl@0
   574
	//TODO: this will fail if the total input length is longer than 2^32 in bits
sl@0
   575
	//(2^31 in bytes) which is roughly half a gig.
sl@0
   576
	iData[14]=0;
sl@0
   577
	iData[15]=iNh<<3;//number in bits
sl@0
   578
	Block();
sl@0
   579
	//
sl@0
   580
	// Generate hash value into iHash
sl@0
   581
	//
sl@0
   582
	TUint tmp=iA;
sl@0
   583
	iHash[3]=(TUint8)(tmp & 255);
sl@0
   584
	iHash[2]=(TUint8)((tmp >>= 8) & 255);
sl@0
   585
	iHash[1]=(TUint8)((tmp >>= 8) & 255);
sl@0
   586
	iHash[0]=(TUint8)((tmp >>= 8) & 255);
sl@0
   587
sl@0
   588
	tmp=iB;
sl@0
   589
	iHash[7]=(TUint8)(tmp & 255);
sl@0
   590
	iHash[6]=(TUint8)((tmp >>= 8) & 255);
sl@0
   591
	iHash[5]=(TUint8)((tmp >>= 8) & 255);
sl@0
   592
	iHash[4]=(TUint8)((tmp >>= 8) & 255);
sl@0
   593
sl@0
   594
	tmp=iC;
sl@0
   595
	iHash[11]=(TUint8)(tmp & 255);
sl@0
   596
	iHash[10]=(TUint8)((tmp >>= 8) & 255);
sl@0
   597
	iHash[9]=(TUint8)((tmp >>= 8) & 255);
sl@0
   598
	iHash[8]=(TUint8)((tmp >>= 8) & 255);
sl@0
   599
sl@0
   600
	tmp=iD;
sl@0
   601
	iHash[15]=(TUint8)(tmp & 255);
sl@0
   602
	iHash[14]=(TUint8)((tmp >>= 8) & 255);
sl@0
   603
	iHash[13]=(TUint8)((tmp >>= 8) & 255);
sl@0
   604
	iHash[12]=(TUint8)((tmp >>= 8) & 255);
sl@0
   605
	
sl@0
   606
	tmp=iE;
sl@0
   607
	iHash[19]=(TUint8)(tmp & 255);
sl@0
   608
	iHash[18]=(TUint8)((tmp >>= 8) & 255);
sl@0
   609
	iHash[17]=(TUint8)((tmp >>= 8) & 255);
sl@0
   610
	iHash[16]=(TUint8)((tmp >>= 8) & 255);
sl@0
   611
	}