sl@0: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // f32test\loader\security\t_sfhash.cpp sl@0: // sl@0: // sl@0: sl@0: #include "t_hash.h" sl@0: #define EXPANDLOOP sl@0: sl@0: sl@0: static inline TUint CMD_R(TUint a,TUint s) sl@0: { sl@0: return (a<>(32-s)); sl@0: } sl@0: sl@0: CSHA1::CSHA1(void) sl@0: : iHash(SHA1_HASH) sl@0: { sl@0: } sl@0: sl@0: CSHA1* CSHA1::NewL(void) sl@0: { sl@0: CSHA1* self=new(ELeave) CSHA1; sl@0: self->Reset(); sl@0: return self; sl@0: } sl@0: sl@0: void CSHA1::Update(const TDesC8& aMessage) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: sl@0: TPtrC8 CSHA1::Final() sl@0: { sl@0: TPtrC8 ptr(KNullDesC8()); sl@0: DoFinal(); sl@0: ptr.Set(iHash); sl@0: Reset(); sl@0: return ptr; sl@0: } sl@0: sl@0: CSHA1::~CSHA1(void) sl@0: { sl@0: } sl@0: sl@0: void CSHA1::Reset(void) sl@0: { sl@0: iA=0x67452301; sl@0: iB=0xefcdab89; sl@0: iC=0x98badcfe; sl@0: iD=0x10325476; sl@0: iE=0xc3d2e1f0; sl@0: iNh=0; sl@0: iNl=0; sl@0: } sl@0: sl@0: // This assumes a big-endian architecture sl@0: void CSHA1::DoUpdate(const TUint8* aData,TUint aLength) sl@0: { sl@0: while((aLength / 4) > 0 && (iNl % 4 == 0)) sl@0: { sl@0: iData[iNl>>2] = aData[0] << 24 | aData[1] << 16 | aData[2] << 8 | aData[3]; sl@0: iNl+=4; sl@0: aData+=4; sl@0: aLength-=4; sl@0: if(iNl==64) sl@0: { sl@0: Block(); sl@0: iNh+=64; sl@0: iNl=0; sl@0: } sl@0: } sl@0: sl@0: while(aLength--) sl@0: { sl@0: switch (iNl&3) sl@0: { sl@0: case 0: sl@0: iData[iNl>>2]=((TUint)(*aData))<<24; sl@0: break; sl@0: case 1: sl@0: iData[iNl>>2]|=((TUint)(*aData))<<16; sl@0: break; sl@0: case 2: sl@0: iData[iNl>>2]|=((TUint)(*aData))<<8; sl@0: break; sl@0: case 3: sl@0: iData[iNl>>2]|=((TUint)(*aData)); sl@0: break; sl@0: default: sl@0: break; sl@0: }; sl@0: aData++; sl@0: iNl++; sl@0: if(iNl==64) sl@0: { sl@0: Block(); sl@0: iNh+=64; sl@0: iNl=0; sl@0: } sl@0: } sl@0: } sl@0: sl@0: static inline TUint CSHA1_F(const TUint x,const TUint y,const TUint z) sl@0: { sl@0: return (x&y) | (~x&z); sl@0: } sl@0: sl@0: static inline TUint CSHA1_G(const TUint x,const TUint y,const TUint z) sl@0: { sl@0: return x^y^z; sl@0: } sl@0: sl@0: static inline TUint CSHA1_H(const TUint x,const TUint y,const TUint z) sl@0: { sl@0: return (x&y) | (x&z) | (y&z); sl@0: } sl@0: sl@0: /*static inline TUint CSHA1_I(const TUint x,const TUint y,const TUint z) sl@0: { sl@0: return x^y^z; sl@0: }*/ sl@0: sl@0: #ifdef EXPANDLOOP sl@0: sl@0: #ifdef MACRO sl@0: sl@0: #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: y=CMD_R(y,30);t=v; sl@0: #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: CSHA1_16(x,y,z,u,t,v,w0); sl@0: #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: v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0x6ed9eba1;\ sl@0: y=CMD_R(y,30);t=v; sl@0: #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: v=CMD_R(x,5)+CSHA1_H(y,z,u)+t+w0+0x8f1bbcdc;\ sl@0: y=CMD_R(y,30);t=v; sl@0: #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: v=CMD_R(x,5)+CSHA1_G(y,z,u)+t+w0+0xca62c1d6;\ sl@0: y=CMD_R(y,30);t=v; sl@0: #else sl@0: sl@0: static inline void CSHA1_16(const TUint x, TUint& y, const TUint z, sl@0: const TUint u, TUint& t, TUint& v, const TUint w) sl@0: { sl@0: v = CMD_R(x,5) + CSHA1_F(y,z,u) + t + w + 0x5a827999; sl@0: y = CMD_R(y,30); sl@0: t = v; sl@0: } sl@0: sl@0: static inline void CSHA1_20(const TUint x,TUint& y,const TUint z, sl@0: const TUint u,TUint& t,TUint& v, sl@0: TUint& w0,const TUint w3,const TUint w8, sl@0: const TUint w14,const TUint w16) sl@0: { sl@0: v = w3 ^ w8 ^ w14 ^ w16; sl@0: w0 = CMD_R(v,1); sl@0: CSHA1_16(x,y,z,u,t,v,w0); sl@0: } sl@0: sl@0: static inline void CSHA1_40(const TUint x,TUint& y,const TUint z, sl@0: const TUint u,TUint& t,TUint& v, sl@0: TUint& w0,const TUint w3,const TUint w8, sl@0: const TUint w14,const TUint w16) sl@0: { sl@0: v = w3 ^ w8 ^ w14 ^ w16; sl@0: w0 = CMD_R(v,1); sl@0: v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0x6ed9eba1; sl@0: y = CMD_R(y,30); sl@0: t = v; sl@0: } sl@0: sl@0: static inline void CSHA1_60(const TUint x,TUint& y,const TUint z, sl@0: const TUint u,TUint& t,TUint& v, sl@0: TUint& w0,const TUint w3,const TUint w8, sl@0: const TUint w14,const TUint w16) sl@0: { sl@0: v = w3 ^ w8 ^ w14 ^ w16; sl@0: w0 = CMD_R(v,1); sl@0: v = CMD_R(x,5) + CSHA1_H(y,z,u) + t + w0 + 0x8f1bbcdc; sl@0: y = CMD_R(y,30); sl@0: t = v; sl@0: } sl@0: sl@0: static inline void CSHA1_80(const TUint x,TUint& y,const TUint z, sl@0: const TUint u,TUint& t,TUint& v, sl@0: TUint& w0,const TUint w3,const TUint w8, sl@0: const TUint w14,const TUint w16) sl@0: { sl@0: v = w3 ^ w8 ^ w14 ^ w16; sl@0: w0 = CMD_R(v,1); sl@0: v = CMD_R(x,5) + CSHA1_G(y,z,u) + t + w0 + 0xca62c1d6; sl@0: y = CMD_R(y,30); sl@0: t = v; sl@0: } sl@0: sl@0: #endif // MACRO sl@0: #endif // EXPANDLOOP sl@0: sl@0: #ifdef WEIDAI sl@0: sl@0: template inline T rotlFixed(T x, unsigned int y) sl@0: { sl@0: ASSERT(y < sizeof(T)*8); sl@0: return (x<>(sizeof(T)*8-y)); sl@0: } sl@0: sl@0: template<> inline TUint32 rotlFixed(TUint32 x, unsigned int y) sl@0: { sl@0: ASSERT(y < 32); sl@0: return y ? CMD_R(x, y) : x; sl@0: } sl@0: sl@0: #define blk0(i) (W[i] = iData[i]) sl@0: #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: sl@0: #define f1(x,y,z) (z^(x&(y^z))) sl@0: #define f2(x,y,z) (x^y^z) sl@0: #define f3(x,y,z) ((x&y)|(z&(x|y))) sl@0: #define f4(x,y,z) (x^y^z) sl@0: sl@0: /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ sl@0: #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: #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: #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: #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: #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: sl@0: #endif // WEIDAI sl@0: sl@0: void CSHA1::Block() sl@0: { sl@0: #ifdef WEIDAI sl@0: TUint32 W[16]; sl@0: /* Copy context->state[] to working vars */ sl@0: TUint32 a = iA; sl@0: TUint32 b = iB; sl@0: TUint32 c = iC; sl@0: TUint32 d = iD; sl@0: TUint32 e = iE; sl@0: sl@0: /* 4 rounds of 20 operations each. Loop unrolled. */ sl@0: sl@0: R0(a,b,c,d,e, 0); sl@0: R0(e,a,b,c,d, 1); sl@0: R0(d,e,a,b,c, 2); sl@0: R0(c,d,e,a,b, 3); sl@0: R0(b,c,d,e,a, 4); sl@0: R0(a,b,c,d,e, 5); sl@0: R0(e,a,b,c,d, 6); sl@0: R0(d,e,a,b,c, 7); sl@0: R0(c,d,e,a,b, 8); sl@0: R0(b,c,d,e,a, 9); sl@0: R0(a,b,c,d,e,10); sl@0: R0(e,a,b,c,d,11); sl@0: R0(d,e,a,b,c,12); sl@0: R0(c,d,e,a,b,13); sl@0: R0(b,c,d,e,a,14); sl@0: R0(a,b,c,d,e,15); sl@0: sl@0: R1(e,a,b,c,d,16); sl@0: R1(d,e,a,b,c,17); sl@0: R1(c,d,e,a,b,18); sl@0: R1(b,c,d,e,a,19); sl@0: sl@0: R2(a,b,c,d,e,20); sl@0: R2(e,a,b,c,d,21); sl@0: R2(d,e,a,b,c,22); sl@0: R2(c,d,e,a,b,23); sl@0: R2(b,c,d,e,a,24); sl@0: R2(a,b,c,d,e,25); sl@0: R2(e,a,b,c,d,26); sl@0: R2(d,e,a,b,c,27); sl@0: R2(c,d,e,a,b,28); sl@0: R2(b,c,d,e,a,29); sl@0: R2(a,b,c,d,e,30); sl@0: R2(e,a,b,c,d,31); sl@0: R2(d,e,a,b,c,32); sl@0: R2(c,d,e,a,b,33); sl@0: R2(b,c,d,e,a,34); sl@0: R2(a,b,c,d,e,35); sl@0: R2(e,a,b,c,d,36); sl@0: R2(d,e,a,b,c,37); sl@0: R2(c,d,e,a,b,38); sl@0: R2(b,c,d,e,a,39); sl@0: sl@0: R3(a,b,c,d,e,40); sl@0: R3(e,a,b,c,d,41); sl@0: R3(d,e,a,b,c,42); sl@0: R3(c,d,e,a,b,43); sl@0: R3(b,c,d,e,a,44); sl@0: R3(a,b,c,d,e,45); sl@0: R3(e,a,b,c,d,46); sl@0: R3(d,e,a,b,c,47); sl@0: R3(c,d,e,a,b,48); sl@0: R3(b,c,d,e,a,49); sl@0: R3(a,b,c,d,e,50); sl@0: R3(e,a,b,c,d,51); sl@0: R3(d,e,a,b,c,52); sl@0: R3(c,d,e,a,b,53); sl@0: R3(b,c,d,e,a,54); sl@0: R3(a,b,c,d,e,55); sl@0: R3(e,a,b,c,d,56); sl@0: R3(d,e,a,b,c,57); sl@0: R3(c,d,e,a,b,58); sl@0: R3(b,c,d,e,a,59); sl@0: sl@0: R4(a,b,c,d,e,60); sl@0: R4(e,a,b,c,d,61); sl@0: R4(d,e,a,b,c,62); sl@0: R4(c,d,e,a,b,63); sl@0: R4(b,c,d,e,a,64); sl@0: R4(a,b,c,d,e,65); sl@0: R4(e,a,b,c,d,66); sl@0: R4(d,e,a,b,c,67); sl@0: R4(c,d,e,a,b,68); sl@0: R4(b,c,d,e,a,69); sl@0: R4(a,b,c,d,e,70); sl@0: R4(e,a,b,c,d,71); sl@0: R4(d,e,a,b,c,72); sl@0: R4(c,d,e,a,b,73); sl@0: R4(b,c,d,e,a,74); sl@0: R4(a,b,c,d,e,75); sl@0: R4(e,a,b,c,d,76); sl@0: R4(d,e,a,b,c,77); sl@0: R4(c,d,e,a,b,78); sl@0: R4(b,c,d,e,a,79); sl@0: sl@0: /* Add the working vars back into context.state[] */ sl@0: iA += a; sl@0: iB += b; sl@0: iC += c; sl@0: iD += d; sl@0: iE += e; sl@0: /* Wipe variables */ sl@0: a = b = c = d = e = 0; sl@0: Mem::FillZ(W, sizeof(W)); sl@0: #else sl@0: TUint tempA=iA; sl@0: TUint tempB=iB; sl@0: TUint tempC=iC; sl@0: TUint tempD=iD; sl@0: TUint tempE=iE; sl@0: TUint temp=0; sl@0: sl@0: #ifdef EXPANDLOOP sl@0: CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[0]); sl@0: CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[1]); sl@0: CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[2]); sl@0: CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[3]); sl@0: CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[4]); sl@0: CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[5]); sl@0: CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[6]); sl@0: CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[7]); sl@0: CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[8]); sl@0: CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[9]); sl@0: CSHA1_16(tempC,tempD,tempE,temp,tempA,tempB,iData[10]); sl@0: CSHA1_16(tempB,tempC,tempD,tempE,temp,tempA,iData[11]); sl@0: CSHA1_16(tempA,tempB,tempC,tempD,tempE,temp,iData[12]); sl@0: CSHA1_16(temp,tempA,tempB,tempC,tempD,tempE,iData[13]); sl@0: CSHA1_16(tempE,temp,tempA,tempB,tempC,tempD,iData[14]); sl@0: CSHA1_16(tempD,tempE,temp,tempA,tempB,tempC,iData[15]); sl@0: /* sl@0: i = 16; sl@0: TUint temp1 = tempA; sl@0: tempA = sl@0: */ sl@0: #else sl@0: TUint i=0; sl@0: while (i<16) sl@0: { sl@0: temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999; sl@0: tempE = tempD; sl@0: tempD = tempC; sl@0: tempC = CMD_R(tempB,30); sl@0: tempB = tempA; sl@0: tempA = temp; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef EXPANDLOOP sl@0: CSHA1_20(tempC,tempD,tempE,temp,tempA,tempB,iData[16],iData[13],iData[8],iData[2],iData[0]); sl@0: CSHA1_20(tempB,tempC,tempD,tempE,temp,tempA,iData[17],iData[14],iData[9],iData[3],iData[1]); sl@0: CSHA1_20(tempA,tempB,tempC,tempD,tempE,temp,iData[18],iData[15],iData[10],iData[4],iData[2]); sl@0: CSHA1_20(temp,tempA,tempB,tempC,tempD,tempE,iData[19],iData[16],iData[11],iData[5],iData[3]); sl@0: //i = 20; sl@0: #else sl@0: while (i<20) sl@0: { sl@0: temp=iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16]; sl@0: iData[i]=CMD_R(temp,1); sl@0: temp = CMD_R(tempA,5) + CSHA1_F(tempB,tempC,tempD) + tempE + iData[i++] + 0x5a827999; sl@0: tempE = tempD; sl@0: tempD = tempC; sl@0: tempC = CMD_R(tempB,30); sl@0: tempB = tempA; sl@0: tempA = temp; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef EXPANDLOOP sl@0: CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[20],iData[17],iData[12],iData[6],iData[4]); sl@0: CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[21],iData[18],iData[13],iData[7],iData[5]); sl@0: CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[22],iData[19],iData[14],iData[8],iData[6]); sl@0: CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[23],iData[20],iData[15],iData[9],iData[7]); sl@0: CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[24],iData[21],iData[16],iData[10],iData[8]); sl@0: CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[25],iData[22],iData[17],iData[11],iData[9]); sl@0: CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[26],iData[23],iData[18],iData[12],iData[10]); sl@0: CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[27],iData[24],iData[19],iData[13],iData[11]); sl@0: CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[28],iData[25],iData[20],iData[14],iData[12]); sl@0: CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[29],iData[26],iData[21],iData[15],iData[13]); sl@0: CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[30],iData[27],iData[22],iData[16],iData[14]); sl@0: CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[31],iData[28],iData[23],iData[17],iData[15]); sl@0: CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[32],iData[29],iData[24],iData[18],iData[16]); sl@0: CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[33],iData[30],iData[25],iData[19],iData[17]); sl@0: CSHA1_40(tempC,tempD,tempE,temp,tempA,tempB,iData[34],iData[31],iData[26],iData[20],iData[18]); sl@0: CSHA1_40(tempB,tempC,tempD,tempE,temp,tempA,iData[35],iData[32],iData[27],iData[21],iData[19]); sl@0: CSHA1_40(tempA,tempB,tempC,tempD,tempE,temp,iData[36],iData[33],iData[28],iData[22],iData[20]); sl@0: CSHA1_40(temp,tempA,tempB,tempC,tempD,tempE,iData[37],iData[34],iData[29],iData[23],iData[21]); sl@0: CSHA1_40(tempE,temp,tempA,tempB,tempC,tempD,iData[38],iData[35],iData[30],iData[24],iData[22]); sl@0: CSHA1_40(tempD,tempE,temp,tempA,tempB,tempC,iData[39],iData[36],iData[31],iData[25],iData[23]); sl@0: //i = 40; sl@0: #else sl@0: while (i<40) sl@0: { sl@0: temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16]; sl@0: iData[i] = CMD_R(temp,1); sl@0: sl@0: temp = CMD_R(tempA,5) + CSHA1_G(tempB,tempC,tempD) + tempE + iData[i++] + 0x6ed9eba1; sl@0: tempE = tempD; sl@0: tempD = tempC; sl@0: tempC = CMD_R(tempB,30); sl@0: tempB = tempA; sl@0: tempA = temp; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef EXPANDLOOP sl@0: CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[40],iData[37],iData[32],iData[26],iData[24]); sl@0: CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[41],iData[38],iData[33],iData[27],iData[25]); sl@0: CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[42],iData[39],iData[34],iData[28],iData[26]); sl@0: CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[43],iData[40],iData[35],iData[29],iData[27]); sl@0: CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[44],iData[41],iData[36],iData[30],iData[28]); sl@0: CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[45],iData[42],iData[37],iData[31],iData[29]); sl@0: CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[46],iData[43],iData[38],iData[32],iData[30]); sl@0: CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[47],iData[44],iData[39],iData[33],iData[31]); sl@0: CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[48],iData[45],iData[40],iData[34],iData[32]); sl@0: CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[49],iData[46],iData[41],iData[35],iData[33]); sl@0: CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[50],iData[47],iData[42],iData[36],iData[34]); sl@0: CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[51],iData[48],iData[43],iData[37],iData[35]); sl@0: CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[52],iData[49],iData[44],iData[38],iData[36]); sl@0: CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[53],iData[50],iData[45],iData[39],iData[37]); sl@0: CSHA1_60(tempA,tempB,tempC,tempD,tempE,temp,iData[54],iData[51],iData[46],iData[40],iData[38]); sl@0: CSHA1_60(temp,tempA,tempB,tempC,tempD,tempE,iData[55],iData[52],iData[47],iData[41],iData[39]); sl@0: CSHA1_60(tempE,temp,tempA,tempB,tempC,tempD,iData[56],iData[53],iData[48],iData[42],iData[40]); sl@0: CSHA1_60(tempD,tempE,temp,tempA,tempB,tempC,iData[57],iData[54],iData[49],iData[43],iData[41]); sl@0: CSHA1_60(tempC,tempD,tempE,temp,tempA,tempB,iData[58],iData[55],iData[50],iData[44],iData[42]); sl@0: CSHA1_60(tempB,tempC,tempD,tempE,temp,tempA,iData[59],iData[56],iData[51],iData[45],iData[43]); sl@0: //i = 60; sl@0: #else sl@0: while (i<60) sl@0: { sl@0: temp = iData[i-3] ^ iData[i-8] ^ iData[i-14] ^ iData[i-16]; sl@0: iData[i] = CMD_R(temp,1); sl@0: sl@0: temp = CMD_R(tempA,5) + CSHA1_H(tempB,tempC,tempD) + tempE + iData[i++] + 0x8f1bbcdc; sl@0: tempE = tempD; sl@0: tempD = tempC; sl@0: tempC = CMD_R(tempB,30); sl@0: tempB = tempA; sl@0: tempA = temp; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef EXPANDLOOP sl@0: CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[60],iData[57],iData[52],iData[46],iData[44]); sl@0: CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[61],iData[58],iData[53],iData[47],iData[45]); sl@0: CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[62],iData[59],iData[54],iData[48],iData[46]); sl@0: CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[63],iData[60],iData[55],iData[49],iData[47]); sl@0: CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[64],iData[61],iData[56],iData[50],iData[48]); sl@0: CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[65],iData[62],iData[57],iData[51],iData[49]); sl@0: CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[66],iData[63],iData[58],iData[52],iData[50]); sl@0: CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[67],iData[64],iData[59],iData[53],iData[51]); sl@0: CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[68],iData[65],iData[60],iData[54],iData[52]); sl@0: CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[69],iData[66],iData[61],iData[55],iData[53]); sl@0: CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[70],iData[67],iData[62],iData[56],iData[54]); sl@0: CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[71],iData[68],iData[63],iData[57],iData[55]); sl@0: CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[72],iData[69],iData[64],iData[58],iData[56]); sl@0: CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[73],iData[70],iData[65],iData[59],iData[57]); sl@0: CSHA1_80(tempE,temp,tempA,tempB,tempC,tempD,iData[74],iData[71],iData[66],iData[60],iData[58]); sl@0: CSHA1_80(tempD,tempE,temp,tempA,tempB,tempC,iData[75],iData[72],iData[67],iData[61],iData[59]); sl@0: CSHA1_80(tempC,tempD,tempE,temp,tempA,tempB,iData[76],iData[73],iData[68],iData[62],iData[60]); sl@0: CSHA1_80(tempB,tempC,tempD,tempE,temp,tempA,iData[77],iData[74],iData[69],iData[63],iData[61]); sl@0: CSHA1_80(tempA,tempB,tempC,tempD,tempE,temp,iData[78],iData[75],iData[70],iData[64],iData[62]); sl@0: CSHA1_80(temp,tempA,tempB,tempC,tempD,tempE,iData[79],iData[76],iData[71],iData[65],iData[63]); sl@0: #else sl@0: const TUint total=SHA1_LBLOCK*5; // 16 * 5 = 80 sl@0: while (i>2] = ul128<<24; sl@0: break; sl@0: case 1: sl@0: iData[iNl>>2] += ul128<<16; sl@0: break; sl@0: case 2: sl@0: iData[iNl>>2] += ul128<<8; sl@0: break; sl@0: case 3: sl@0: iData[iNl>>2] += ul128; sl@0: break; sl@0: default: sl@0: break; sl@0: }; sl@0: if (iNl>=56) sl@0: { sl@0: if (iNl<60) sl@0: iData[15]=0; sl@0: Block(); sl@0: Mem::FillZ(iData,14*sizeof(TUint)); sl@0: } sl@0: else sl@0: { sl@0: const TUint offset=(iNl+4)>>2; //+4 to account for the word added in the sl@0: //switch statement above sl@0: Mem::FillZ(iData+offset,(14-offset)*sizeof(TUint)); sl@0: } sl@0: sl@0: //TODO: this will fail if the total input length is longer than 2^32 in bits sl@0: //(2^31 in bytes) which is roughly half a gig. sl@0: iData[14]=0; sl@0: iData[15]=iNh<<3;//number in bits sl@0: Block(); sl@0: // sl@0: // Generate hash value into iHash sl@0: // sl@0: TUint tmp=iA; sl@0: iHash[3]=(TUint8)(tmp & 255); sl@0: iHash[2]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[1]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[0]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iB; sl@0: iHash[7]=(TUint8)(tmp & 255); sl@0: iHash[6]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[5]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[4]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iC; sl@0: iHash[11]=(TUint8)(tmp & 255); sl@0: iHash[10]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[9]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[8]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iD; sl@0: iHash[15]=(TUint8)(tmp & 255); sl@0: iHash[14]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[13]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[12]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iE; sl@0: iHash[19]=(TUint8)(tmp & 255); sl@0: iHash[18]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[17]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[16]=(TUint8)((tmp >>= 8) & 255); sl@0: }