sl@0: /* sl@0: * Copyright (c) 2006-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 md5 implementation sl@0: * software md5 implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: sl@0: #include "md5impl.h" sl@0: #include sl@0: #include "pluginconfig.h" sl@0: sl@0: using namespace SoftwareCrypto; sl@0: sl@0: sl@0: CMD5Impl* CMD5Impl::NewL() sl@0: { sl@0: CMD5Impl* self=new (ELeave) CMD5Impl(); sl@0: self->Reset(); sl@0: return self; sl@0: } sl@0: sl@0: CMD5Impl* CMD5Impl::NewLC() sl@0: { sl@0: CMD5Impl* self=NewL(); sl@0: CleanupStack::PushL(self); sl@0: return self; sl@0: } sl@0: sl@0: CMD5Impl::CMD5Impl() : iHash(KMD5HashSize) sl@0: { sl@0: } sl@0: sl@0: CMD5Impl::CMD5Impl(const CMD5Impl& aCMD5Impl) sl@0: : iHash(aCMD5Impl.iHash),iA(aCMD5Impl.iA),iB(aCMD5Impl.iB),iC(aCMD5Impl.iC),iD(aCMD5Impl.iD), sl@0: iNl(aCMD5Impl.iNl),iNh(aCMD5Impl.iNh) sl@0: { sl@0: (void)Mem::Copy(iData, aCMD5Impl.iData, sizeof(iData)); sl@0: } sl@0: sl@0: CMD5Impl::~CMD5Impl() sl@0: { sl@0: } sl@0: sl@0: void CMD5Impl::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 CMD5Impl::Close() sl@0: { sl@0: delete this; sl@0: } sl@0: sl@0: void CMD5Impl::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* CMD5Impl::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: sl@0: const CExtendedCharacteristics* CMD5Impl::GetExtendedCharacteristicsL() sl@0: { sl@0: return CMD5Impl::CreateExtendedCharacteristicsL(); sl@0: } sl@0: sl@0: TPtrC8 CMD5Impl::Hash(const TDesC8& aMessage) sl@0: { sl@0: sl@0: TPtrC8 ptr(KNullDesC8()); sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: StoreState(); sl@0: DoFinal(); sl@0: ptr.Set(iHash); sl@0: RestoreState(); sl@0: return ptr; sl@0: } sl@0: sl@0: void CMD5Impl::Update(const TDesC8& aMessage) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: sl@0: TPtrC8 CMD5Impl::Final(const TDesC8& aMessage) sl@0: { sl@0: TPtrC8 ptr(KNullDesC8()); sl@0: if (aMessage!=KNullDesC8()) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: DoFinal(); sl@0: ptr.Set(iHash); sl@0: Reset(); sl@0: return ptr; sl@0: } sl@0: sl@0: MHash* CMD5Impl::ReplicateL() sl@0: { sl@0: return CMD5Impl::NewL(); sl@0: } sl@0: sl@0: MHash* CMD5Impl::CopyL() sl@0: { sl@0: return new(ELeave) CMD5Impl(*this); sl@0: } sl@0: sl@0: TUid CMD5Impl::ImplementationUid() sl@0: { sl@0: return KCryptoPluginMd5Uid; sl@0: } sl@0: sl@0: void CMD5Impl::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 CMD5_F(TUint x,TUint y,TUint z) sl@0: { sl@0: return (x&y) | (~x&z); sl@0: } sl@0: static inline TUint CMD5_G(TUint x,TUint y,TUint z) sl@0: { sl@0: return (x&z) | (y&~z); sl@0: } sl@0: static inline TUint CMD5_H(TUint x,TUint y,TUint z) sl@0: { sl@0: return x^y^z; sl@0: } sl@0: static inline TUint CMD5_I(TUint x,TUint y,TUint z) sl@0: { sl@0: return y^(x|~z); sl@0: } sl@0: sl@0: sl@0: #ifdef NOREFS sl@0: static inline TUint CMD5_FF(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_F(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: return a; sl@0: } sl@0: static inline TUint CMD5_GG(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_G(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: return a; sl@0: } sl@0: static inline TUint CMD5_HH(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_H(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: return a; sl@0: } sl@0: static inline TUint CMD5_II(TUint a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_I(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: return a; sl@0: } sl@0: void CMD5Impl::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 = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821); sl@0: sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a); sl@0: sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665); sl@0: sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391); 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 CMD5_FF(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_F(b,c,d) + m + t, s)) sl@0: #define CMD5_GG(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_G(b,c,d) + m + t, s)) sl@0: #define CMD5_HH(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_H(b,c,d) + m + t, s)) sl@0: #define CMD5_II(a, b, c, d, m, s, t) (b + CMD_R(a += CMD5_I(b,c,d) + m + t, s)) sl@0: void CMD5Impl::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 = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be); sl@0: tempA = CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122); sl@0: tempD = CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193); sl@0: tempC = CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e); sl@0: tempB = CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821); sl@0: sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed); sl@0: tempA = CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905); sl@0: tempD = CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8); sl@0: tempC = CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9); sl@0: tempB = CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a); sl@0: sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05); sl@0: tempA = CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039); sl@0: tempD = CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5); sl@0: tempC = CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8); sl@0: tempB = CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665); sl@0: sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1); sl@0: tempA = CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82); sl@0: tempD = CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235); sl@0: tempC = CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb); sl@0: tempB = CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391); 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 CMD5_FF(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_F(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: } sl@0: static inline void CMD5_GG(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_G(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: } sl@0: static inline void CMD5_HH(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_H(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: } sl@0: static inline void CMD5_II(TUint& a,const TUint b,const TUint c,const TUint d,const TUint m,const TUint s,const TUint t) sl@0: { sl@0: a+=CMD5_I(b,c,d) + m + t; sl@0: a=b + CMD_R(a,s); sl@0: } sl@0: void CMD5Impl::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: CMD5_FF(tempA,tempB,tempC,tempD,iData[ 0], 7, 0xd76aa478); sl@0: CMD5_FF(tempD,tempA,tempB,tempC,iData[ 1],12, 0xe8c7b756); sl@0: CMD5_FF(tempC,tempD,tempA,tempB,iData[ 2],17, 0x242070db); sl@0: CMD5_FF(tempB,tempC,tempD,tempA,iData[ 3],22, 0xc1bdceee); sl@0: CMD5_FF(tempA,tempB,tempC,tempD,iData[ 4], 7, 0xf57c0faf); sl@0: CMD5_FF(tempD,tempA,tempB,tempC,iData[ 5],12, 0x4787c62a); sl@0: CMD5_FF(tempC,tempD,tempA,tempB,iData[ 6],17, 0xa8304613); sl@0: CMD5_FF(tempB,tempC,tempD,tempA,iData[ 7],22, 0xfd469501); sl@0: CMD5_FF(tempA,tempB,tempC,tempD,iData[ 8], 7, 0x698098d8); sl@0: CMD5_FF(tempD,tempA,tempB,tempC,iData[ 9],12, 0x8b44f7af); sl@0: CMD5_FF(tempC,tempD,tempA,tempB,iData[10],17, 0xffff5bb1); sl@0: CMD5_FF(tempB,tempC,tempD,tempA,iData[11],22, 0x895cd7be); sl@0: CMD5_FF(tempA,tempB,tempC,tempD,iData[12], 7, 0x6b901122); sl@0: CMD5_FF(tempD,tempA,tempB,tempC,iData[13],12, 0xfd987193); sl@0: CMD5_FF(tempC,tempD,tempA,tempB,iData[14],17, 0xa679438e); sl@0: CMD5_FF(tempB,tempC,tempD,tempA,iData[15],22, 0x49b40821); sl@0: sl@0: CMD5_GG(tempA,tempB,tempC,tempD,iData[ 1], 5, 0xf61e2562); sl@0: CMD5_GG(tempD,tempA,tempB,tempC,iData[ 6], 9, 0xc040b340); sl@0: CMD5_GG(tempC,tempD,tempA,tempB,iData[11],14, 0x265e5a51); sl@0: CMD5_GG(tempB,tempC,tempD,tempA,iData[ 0],20, 0xe9b6c7aa); sl@0: CMD5_GG(tempA,tempB,tempC,tempD,iData[ 5], 5, 0xd62f105d); sl@0: CMD5_GG(tempD,tempA,tempB,tempC,iData[10], 9, 0x02441453); sl@0: CMD5_GG(tempC,tempD,tempA,tempB,iData[15],14, 0xd8a1e681); sl@0: CMD5_GG(tempB,tempC,tempD,tempA,iData[ 4],20, 0xe7d3fbc8); sl@0: CMD5_GG(tempA,tempB,tempC,tempD,iData[ 9], 5, 0x21e1cde6); sl@0: CMD5_GG(tempD,tempA,tempB,tempC,iData[14], 9, 0xc33707d6); sl@0: CMD5_GG(tempC,tempD,tempA,tempB,iData[ 3],14, 0xf4d50d87); sl@0: CMD5_GG(tempB,tempC,tempD,tempA,iData[ 8],20, 0x455a14ed); sl@0: CMD5_GG(tempA,tempB,tempC,tempD,iData[13], 5, 0xa9e3e905); sl@0: CMD5_GG(tempD,tempA,tempB,tempC,iData[ 2], 9, 0xfcefa3f8); sl@0: CMD5_GG(tempC,tempD,tempA,tempB,iData[ 7],14, 0x676f02d9); sl@0: CMD5_GG(tempB,tempC,tempD,tempA,iData[12],20, 0x8d2a4c8a); sl@0: sl@0: CMD5_HH(tempA,tempB,tempC,tempD,iData[ 5], 4, 0xfffa3942); sl@0: CMD5_HH(tempD,tempA,tempB,tempC,iData[ 8],11, 0x8771f681); sl@0: CMD5_HH(tempC,tempD,tempA,tempB,iData[11],16, 0x6d9d6122); sl@0: CMD5_HH(tempB,tempC,tempD,tempA,iData[14],23, 0xfde5380c); sl@0: CMD5_HH(tempA,tempB,tempC,tempD,iData[ 1], 4, 0xa4beea44); sl@0: CMD5_HH(tempD,tempA,tempB,tempC,iData[ 4],11, 0x4bdecfa9); sl@0: CMD5_HH(tempC,tempD,tempA,tempB,iData[ 7],16, 0xf6bb4b60); sl@0: CMD5_HH(tempB,tempC,tempD,tempA,iData[10],23, 0xbebfbc70); sl@0: CMD5_HH(tempA,tempB,tempC,tempD,iData[13], 4, 0x289b7ec6); sl@0: CMD5_HH(tempD,tempA,tempB,tempC,iData[ 0],11, 0xeaa127fa); sl@0: CMD5_HH(tempC,tempD,tempA,tempB,iData[ 3],16, 0xd4ef3085); sl@0: CMD5_HH(tempB,tempC,tempD,tempA,iData[ 6],23, 0x04881d05); sl@0: CMD5_HH(tempA,tempB,tempC,tempD,iData[ 9], 4, 0xd9d4d039); sl@0: CMD5_HH(tempD,tempA,tempB,tempC,iData[12],11, 0xe6db99e5); sl@0: CMD5_HH(tempC,tempD,tempA,tempB,iData[15],16, 0x1fa27cf8); sl@0: CMD5_HH(tempB,tempC,tempD,tempA,iData[ 2],23, 0xc4ac5665); sl@0: sl@0: CMD5_II(tempA,tempB,tempC,tempD,iData[ 0], 6, 0xf4292244); sl@0: CMD5_II(tempD,tempA,tempB,tempC,iData[ 7],10, 0x432aff97); sl@0: CMD5_II(tempC,tempD,tempA,tempB,iData[14],15, 0xab9423a7); sl@0: CMD5_II(tempB,tempC,tempD,tempA,iData[ 5],21, 0xfc93a039); sl@0: CMD5_II(tempA,tempB,tempC,tempD,iData[12], 6, 0x655b59c3); sl@0: CMD5_II(tempD,tempA,tempB,tempC,iData[ 3],10, 0x8f0ccc92); sl@0: CMD5_II(tempC,tempD,tempA,tempB,iData[10],15, 0xffeff47d); sl@0: CMD5_II(tempB,tempC,tempD,tempA,iData[ 1],21, 0x85845dd1); sl@0: CMD5_II(tempA,tempB,tempC,tempD,iData[ 8], 6, 0x6fa87e4f); sl@0: CMD5_II(tempD,tempA,tempB,tempC,iData[15],10, 0xfe2ce6e0); sl@0: CMD5_II(tempC,tempD,tempA,tempB,iData[ 6],15, 0xa3014314); sl@0: CMD5_II(tempB,tempC,tempD,tempA,iData[13],21, 0x4e0811a1); sl@0: CMD5_II(tempA,tempB,tempC,tempD,iData[ 4], 6, 0xf7537e82); sl@0: CMD5_II(tempD,tempA,tempB,tempC,iData[11],10, 0xbd3af235); sl@0: CMD5_II(tempC,tempD,tempA,tempB,iData[ 2],15, 0x2ad7d2bb); sl@0: CMD5_II(tempB,tempC,tempD,tempA,iData[ 9],21, 0xeb86d391); 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 CMD5Impl::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: 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 CMD5Impl::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], KMD5BlockSize*sizeof(TUint)); sl@0: } sl@0: sl@0: void CMD5Impl::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], KMD5BlockSize*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* CMD5Impl::GetExtension(TUid /*aExtensionId*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: void CMD5Impl::SetOperationModeL(TUid /*aOperationMode*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: void CMD5Impl::SetKeyL(const CKey& /*aKey*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: