sl@0: /* sl@0: * Copyright (c) 2007-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: * software md4 implementation sl@0: * software md4 implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: sl@0: #include "md4impl.h" sl@0: #include sl@0: #include "pluginconfig.h" sl@0: sl@0: sl@0: using namespace SoftwareCrypto; sl@0: sl@0: sl@0: CMD4Impl* CMD4Impl::NewL() sl@0: { sl@0: CMD4Impl* self=new (ELeave) CMD4Impl(); sl@0: self->Reset(); sl@0: return self; sl@0: } sl@0: sl@0: CMD4Impl* CMD4Impl::NewLC() sl@0: { sl@0: CMD4Impl* self=NewL(); sl@0: CleanupStack::PushL(self); sl@0: return self; sl@0: } sl@0: sl@0: CMD4Impl::CMD4Impl() : iHash(KMD4HashSize) sl@0: { sl@0: } sl@0: sl@0: CMD4Impl::CMD4Impl(const CMD4Impl& aCMD4Impl) sl@0: : iHash(aCMD4Impl.iHash),iA(aCMD4Impl.iA),iB(aCMD4Impl.iB),iC(aCMD4Impl.iC),iD(aCMD4Impl.iD), sl@0: iNl(aCMD4Impl.iNl),iNh(aCMD4Impl.iNh) sl@0: { sl@0: (void)Mem::Copy(iData, aCMD4Impl.iData, sizeof(iData)); sl@0: } sl@0: sl@0: CMD4Impl::~CMD4Impl() sl@0: { sl@0: } sl@0: sl@0: void CMD4Impl::Reset() sl@0: { sl@0: iA=0x67452301; sl@0: iB=0xefcdab89; sl@0: iC=0x98badcfe; sl@0: iD=0x10325476; sl@0: iNh=0; sl@0: iNl=0; sl@0: } sl@0: sl@0: void CMD4Impl::Close() sl@0: { sl@0: delete this; sl@0: } sl@0: sl@0: void CMD4Impl::GetCharacteristicsL(const TCharacteristics*& aPluginCharacteristics) sl@0: { sl@0: aPluginCharacteristics=NULL; sl@0: TInt hashNum=sizeof(KHashCharacteristics)/sizeof(THashCharacteristics*); sl@0: for (TInt i=0;icmn.iImplementationUID == ImplementationUid().iUid) sl@0: { sl@0: aPluginCharacteristics = KHashCharacteristics[i]; sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: CExtendedCharacteristics* CMD4Impl::CreateExtendedCharacteristicsL() sl@0: { sl@0: // All Symbian software plug-ins have unlimited concurrency, cannot be reserved sl@0: // for exclusive use and are not CERTIFIED to be standards compliant. sl@0: return CExtendedCharacteristics::NewL(KMaxTInt, EFalse); sl@0: } sl@0: const CExtendedCharacteristics* CMD4Impl::GetExtendedCharacteristicsL() sl@0: { sl@0: return CMD4Impl::CreateExtendedCharacteristicsL(); sl@0: } sl@0: sl@0: TPtrC8 CMD4Impl::Hash(const TDesC8& aMessage) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: StoreState(); sl@0: DoFinal(); sl@0: RestoreState(); sl@0: return iHash; sl@0: } sl@0: sl@0: void CMD4Impl::Update(const TDesC8& aMessage) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: sl@0: TPtrC8 CMD4Impl::Final(const TDesC8& aMessage) sl@0: { sl@0: if (aMessage!=KNullDesC8()) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: DoFinal(); sl@0: Reset(); sl@0: return iHash; sl@0: } sl@0: sl@0: MHash* CMD4Impl::ReplicateL() sl@0: { sl@0: return CMD4Impl::NewL(); sl@0: } sl@0: sl@0: MHash* CMD4Impl::CopyL() sl@0: { sl@0: return new(ELeave) CMD4Impl(*this); sl@0: } sl@0: sl@0: TUid CMD4Impl::ImplementationUid() sl@0: { sl@0: return KCryptoPluginMd4Uid; sl@0: } sl@0: sl@0: void CMD4Impl::DoUpdate(const TUint8* aData,TUint aLength) sl@0: { sl@0: const TUint8* pend=aData+aLength; sl@0: for (const TUint8* paData=aData;paData>2]=byte; sl@0: break; sl@0: case 1: sl@0: iData[iNl>>2]|=byte<<8; sl@0: break; sl@0: case 2: sl@0: iData[iNl>>2]|=byte<<16; sl@0: break; sl@0: case 3: sl@0: iData[iNl>>2]|=byte<<24; sl@0: break; sl@0: default: sl@0: break; sl@0: }; 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 CMD4_F(TUint x,TUint y,TUint z) sl@0: { sl@0: return (x&y) | (~x&z); sl@0: } sl@0: static inline TUint CMD4_G(TUint x,TUint y,TUint z) sl@0: { sl@0: return (x&y) | (x&z) | (y&z); sl@0: } sl@0: static inline TUint CMD4_H(TUint x,TUint y,TUint z) sl@0: { sl@0: return x^y^z; sl@0: } sl@0: sl@0: sl@0: #ifdef NOREFS sl@0: static inline TUint CMD4_FF(TUint a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_F(b,c,d) + x; sl@0: a=CMD_R(a,s); sl@0: return a; sl@0: } sl@0: static inline TUint CMD4_GG(TUint a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_G(b,c,d) + x + (TUint32)0x5a827999; sl@0: a=CMD_R(a,s); sl@0: return a; sl@0: } sl@0: static inline TUint CMD4_HH(TUint a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_H(b,c,d) + x + (TUint32)0x6ed9eba1; sl@0: a=CMD_R(a,s); sl@0: return a; sl@0: } sl@0: sl@0: void CMD4Impl::Block() sl@0: { sl@0: register TUint tempA=iA; sl@0: register TUint tempB=iB; sl@0: register TUint tempC=iC; sl@0: register TUint tempD=iD; sl@0: sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 1],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[ 2],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[ 3],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 4],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 5],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[ 7],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 8],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 9],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[10],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[11],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[12],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[13],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[14],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[15],19); sl@0: sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 4],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[ 8],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[12],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 5],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[ 9],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[13],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 6],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[10],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[14],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 7],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[11],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[15],13); sl@0: sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[ 8],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 4],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[12],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[10],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[14],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[ 9],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 5],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[13],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[11],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 7],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[15],15); sl@0: sl@0: iA+=tempA; sl@0: iB+=tempB; sl@0: iC+=tempC; sl@0: iD+=tempD; sl@0: } sl@0: #else sl@0: #ifdef MACRO sl@0: #define CMD4_FF(a, b, c, d, x, s) (CMD_R(a += CMD4_F(b,c,d) + x, s)) sl@0: #define CMD4_GG(a, b, c, d, x, s) (CMD_R(a += CMD4_G(b,c,d) + x + (TUint32)0x5a827999, s)) sl@0: #define CMD4_HH(a, b, c, d, x, s) (CMD_R(a += CMD4_H(b,c,d) + x + (TUint32)0x6ed9eba1, s)) sl@0: void CMD4Impl::Block() sl@0: { sl@0: register TUint tempA=iA; sl@0: register TUint tempB=iB; sl@0: register TUint tempC=iC; sl@0: register TUint tempD=iD; sl@0: sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 1],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[ 2],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[ 3],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 4],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 5],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[ 7],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[ 8],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[ 9],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[10],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[11],19); sl@0: tempA = CMD4_FF(tempA,tempB,tempC,tempD,iData[12],3); sl@0: tempD = CMD4_FF(tempD,tempA,tempB,tempC,iData[13],7); sl@0: tempC = CMD4_FF(tempC,tempD,tempA,tempB,iData[14],11); sl@0: tempB = CMD4_FF(tempB,tempC,tempD,tempA,iData[15],19); sl@0: sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 4],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[ 8],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[12],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 5],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[ 9],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[13],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 6],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[10],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[14],13); sl@0: tempA = CMD4_GG(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: tempD = CMD4_GG(tempD,tempA,tempB,tempC,iData[ 7],5); sl@0: tempC = CMD4_GG(tempC,tempD,tempA,tempB,iData[11],9); sl@0: tempB = CMD4_GG(tempB,tempC,tempD,tempA,iData[15],13); sl@0: sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[ 8],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 4],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[12],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[10],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[14],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[ 9],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 5],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[13],15); sl@0: tempA = CMD4_HH(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: tempD = CMD4_HH(tempD,tempA,tempB,tempC,iData[11],9); sl@0: tempC = CMD4_HH(tempC,tempD,tempA,tempB,iData[ 7],11); sl@0: tempB = CMD4_HH(tempB,tempC,tempD,tempA,iData[15],15); sl@0: sl@0: iA+=tempA; sl@0: iB+=tempB; sl@0: iC+=tempC; sl@0: iD+=tempD; sl@0: } sl@0: #else sl@0: static inline void CMD4_FF(TUint& a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_F(b,c,d) + x; sl@0: a=CMD_R(a,s); sl@0: } sl@0: static inline void CMD4_GG(TUint& a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_G(b,c,d) + x + (TUint32)0x5a827999; sl@0: a=CMD_R(a,s); sl@0: } sl@0: static inline void CMD4_HH(TUint& a,const TUint b,const TUint c,const TUint d,const TUint x,const TUint s) sl@0: { sl@0: a+=CMD4_H(b,c,d) + x + (TUint32)0x6ed9eba1; sl@0: a=CMD_R(a,s); sl@0: } sl@0: sl@0: void CMD4Impl::Block() sl@0: { sl@0: register TUint tempA=iA; sl@0: register TUint tempB=iB; sl@0: register TUint tempC=iC; sl@0: register TUint tempD=iD; sl@0: sl@0: CMD4_FF(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: CMD4_FF(tempD,tempA,tempB,tempC,iData[ 1],7); sl@0: CMD4_FF(tempC,tempD,tempA,tempB,iData[ 2],11); sl@0: CMD4_FF(tempB,tempC,tempD,tempA,iData[ 3],19); sl@0: CMD4_FF(tempA,tempB,tempC,tempD,iData[ 4],3); sl@0: CMD4_FF(tempD,tempA,tempB,tempC,iData[ 5],7); sl@0: CMD4_FF(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: CMD4_FF(tempB,tempC,tempD,tempA,iData[ 7],19); sl@0: CMD4_FF(tempA,tempB,tempC,tempD,iData[ 8],3); sl@0: CMD4_FF(tempD,tempA,tempB,tempC,iData[ 9],7); sl@0: CMD4_FF(tempC,tempD,tempA,tempB,iData[10],11); sl@0: CMD4_FF(tempB,tempC,tempD,tempA,iData[11],19); sl@0: CMD4_FF(tempA,tempB,tempC,tempD,iData[12],3); sl@0: CMD4_FF(tempD,tempA,tempB,tempC,iData[13],7); sl@0: CMD4_FF(tempC,tempD,tempA,tempB,iData[14],11); sl@0: CMD4_FF(tempB,tempC,tempD,tempA,iData[15],19); sl@0: sl@0: CMD4_GG(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: CMD4_GG(tempD,tempA,tempB,tempC,iData[ 4],5); sl@0: CMD4_GG(tempC,tempD,tempA,tempB,iData[ 8],9); sl@0: CMD4_GG(tempB,tempC,tempD,tempA,iData[12],13); sl@0: CMD4_GG(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: CMD4_GG(tempD,tempA,tempB,tempC,iData[ 5],5); sl@0: CMD4_GG(tempC,tempD,tempA,tempB,iData[ 9],9); sl@0: CMD4_GG(tempB,tempC,tempD,tempA,iData[13],13); sl@0: CMD4_GG(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: CMD4_GG(tempD,tempA,tempB,tempC,iData[ 6],5); sl@0: CMD4_GG(tempC,tempD,tempA,tempB,iData[10],9); sl@0: CMD4_GG(tempB,tempC,tempD,tempA,iData[14],13); sl@0: CMD4_GG(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: CMD4_GG(tempD,tempA,tempB,tempC,iData[ 7],5); sl@0: CMD4_GG(tempC,tempD,tempA,tempB,iData[11],9); sl@0: CMD4_GG(tempB,tempC,tempD,tempA,iData[15],13); sl@0: sl@0: CMD4_HH(tempA,tempB,tempC,tempD,iData[ 0],3); sl@0: CMD4_HH(tempD,tempA,tempB,tempC,iData[ 8],9); sl@0: CMD4_HH(tempC,tempD,tempA,tempB,iData[ 4],11); sl@0: CMD4_HH(tempB,tempC,tempD,tempA,iData[12],15); sl@0: CMD4_HH(tempA,tempB,tempC,tempD,iData[ 2],3); sl@0: CMD4_HH(tempD,tempA,tempB,tempC,iData[10],9); sl@0: CMD4_HH(tempC,tempD,tempA,tempB,iData[ 6],11); sl@0: CMD4_HH(tempB,tempC,tempD,tempA,iData[14],15); sl@0: CMD4_HH(tempA,tempB,tempC,tempD,iData[ 1],3); sl@0: CMD4_HH(tempD,tempA,tempB,tempC,iData[ 9],9); sl@0: CMD4_HH(tempC,tempD,tempA,tempB,iData[ 5],11); sl@0: CMD4_HH(tempB,tempC,tempD,tempA,iData[13],15); sl@0: CMD4_HH(tempA,tempB,tempC,tempD,iData[ 3],3); sl@0: CMD4_HH(tempD,tempA,tempB,tempC,iData[11],9); sl@0: CMD4_HH(tempC,tempD,tempA,tempB,iData[ 7],11); sl@0: CMD4_HH(tempB,tempC,tempD,tempA,iData[15],15); sl@0: sl@0: iA+=tempA; sl@0: iB+=tempB; sl@0: iC+=tempC; sl@0: iD+=tempD; sl@0: } sl@0: #endif sl@0: #endif sl@0: sl@0: void CMD4Impl::DoFinal(void) sl@0: { sl@0: iNh += iNl; sl@0: const TUint ul128=128; sl@0: switch (iNl&3) sl@0: { sl@0: case 0: sl@0: iData[iNl>>2] = ul128; sl@0: break; sl@0: case 1: sl@0: iData[iNl>>2] += ul128<<8; sl@0: break; sl@0: case 2: sl@0: iData[iNl>>2] += ul128<<16; sl@0: break; sl@0: case 3: sl@0: iData[iNl>>2] += ul128<<24; 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; sl@0: Mem::FillZ(iData+offset,(14-offset)*sizeof(TUint)); sl@0: } sl@0: sl@0: iData[14]=iNh<<3;//number in bits sl@0: // 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[15]=0; sl@0: sl@0: Block(); sl@0: // sl@0: // Generate hash value into iHash sl@0: // sl@0: TUint tmp=iA; sl@0: iHash[0]=(TUint8)(tmp & 255); sl@0: iHash[1]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[2]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[3]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iB; sl@0: iHash[4]=(TUint8)(tmp & 255); sl@0: iHash[5]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[6]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[7]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iC; sl@0: iHash[8] =(TUint8)(tmp & 255); sl@0: iHash[9] =(TUint8)((tmp >>= 8) & 255); sl@0: iHash[10]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[11]=(TUint8)((tmp >>= 8) & 255); sl@0: sl@0: tmp=iD; sl@0: iHash[12]=(TUint8)(tmp & 255); sl@0: iHash[13]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[14]=(TUint8)((tmp >>= 8) & 255); sl@0: iHash[15]=(TUint8)((tmp >>= 8) & 255); sl@0: } sl@0: sl@0: void CMD4Impl::RestoreState() sl@0: { sl@0: iA = iACopy; sl@0: iB = iBCopy; sl@0: iC = iCCopy; sl@0: iD = iDCopy; sl@0: iNl = iNlCopy; sl@0: iNh = iNhCopy; sl@0: Mem::Copy(&iData[0], &iDataCopy[0], KMD4BlockSize*sizeof(TUint)); sl@0: } sl@0: sl@0: void CMD4Impl::StoreState() sl@0: { sl@0: iACopy = iA; sl@0: iBCopy = iB; sl@0: iCCopy = iC; sl@0: iDCopy = iD; sl@0: iNlCopy = iNl; sl@0: iNhCopy = iNh; sl@0: Mem::Copy(&iDataCopy[0], &iData[0], KMD4BlockSize*sizeof(TUint)); sl@0: } sl@0: sl@0: sl@0: // Implemented in hmacimpl.cpp or softwarehashbase.cpp sl@0: // but required as derived from MHash. No coverage here. sl@0: #ifdef _BullseyeCoverage sl@0: #pragma suppress_warnings on sl@0: #pragma BullseyeCoverage off sl@0: #pragma suppress_warnings off sl@0: #endif sl@0: sl@0: TAny* CMD4Impl::GetExtension(TUid /*aExtensionId*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: void CMD4Impl::SetOperationModeL(TUid /*aOperationMode*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: void CMD4Impl::SetKeyL(const CKey& /*aKey*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: sl@0: sl@0: