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 md2 implementation sl@0: * software md2 implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: sl@0: #include "md2impl.h" sl@0: sl@0: #include sl@0: #include "pluginconfig.h" sl@0: sl@0: using namespace SoftwareCrypto; sl@0: sl@0: CMD2Impl* CMD2Impl::NewL() sl@0: { sl@0: CMD2Impl* self=new (ELeave) CMD2Impl(); sl@0: return self; sl@0: } sl@0: sl@0: CMD2Impl* CMD2Impl::NewLC() sl@0: { sl@0: CMD2Impl* self=NewL(); sl@0: CleanupStack::PushL(self); sl@0: return self; sl@0: } sl@0: sl@0: CMD2Impl::CMD2Impl() : iHash(KMD2HashSize) sl@0: { sl@0: } sl@0: sl@0: CMD2Impl::CMD2Impl(const CMD2Impl& aCMD2Impl) sl@0: : iHash(aCMD2Impl.iHash),iNum(aCMD2Impl.iNum) sl@0: { sl@0: (void)Mem::Copy(iData, aCMD2Impl.iData, sizeof(iData)); sl@0: (void)Mem::Copy(iChecksum, aCMD2Impl.iChecksum, sizeof(iChecksum)); sl@0: (void)Mem::Copy(iState, aCMD2Impl.iState, sizeof(iState)); sl@0: } sl@0: sl@0: CMD2Impl::~CMD2Impl() sl@0: { sl@0: } sl@0: sl@0: void CMD2Impl::Reset() sl@0: { sl@0: Mem::FillZ(iData,sizeof(iData)); sl@0: Mem::FillZ(iChecksum,sizeof(iChecksum)); sl@0: Mem::FillZ(iState,sizeof(iState)); sl@0: iNum=0; sl@0: } sl@0: sl@0: void CMD2Impl::Close() sl@0: { sl@0: delete this; sl@0: } sl@0: sl@0: void CMD2Impl::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* CMD2Impl::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* CMD2Impl::GetExtendedCharacteristicsL() sl@0: { sl@0: return CMD2Impl::CreateExtendedCharacteristicsL(); sl@0: } sl@0: sl@0: TPtrC8 CMD2Impl::Hash(const TDesC8& aMessage) 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 CMD2Impl::Update(const TDesC8& aMessage) sl@0: { sl@0: DoUpdate(aMessage.Ptr(),aMessage.Size()); sl@0: } sl@0: sl@0: TPtrC8 CMD2Impl::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* CMD2Impl::ReplicateL() sl@0: { sl@0: return NewL(); sl@0: } sl@0: sl@0: MHash* CMD2Impl::CopyL() sl@0: { sl@0: return new(ELeave) CMD2Impl(*this); sl@0: } sl@0: sl@0: void CMD2Impl::RestoreState() sl@0: { sl@0: Mem::Copy(&iData[0], &iDataTemp[0], KMD2BlockSize); sl@0: Mem::Copy(&iChecksum[0], &iChecksumTemp[0], KMD2BlockSize*sizeof(TUint)); sl@0: Mem::Copy(&iState[0], &iStateTemp[0], KMD2BlockSize*sizeof(TUint)); sl@0: } sl@0: sl@0: void CMD2Impl::StoreState() sl@0: { sl@0: Mem::Copy(&iDataTemp[0], &iData[0], KMD2BlockSize); sl@0: Mem::Copy(&iChecksumTemp[0], &iChecksum[0], KMD2BlockSize*sizeof(TUint)); sl@0: Mem::Copy(&iStateTemp[0], &iState[0], KMD2BlockSize*sizeof(TUint)); sl@0: } sl@0: sl@0: sl@0: TUid CMD2Impl::ImplementationUid() sl@0: { sl@0: return KCryptoPluginMd2Uid; sl@0: } sl@0: sl@0: static inline TUint CMD2_S(TUint& elt,TUint8 val) sl@0: { sl@0: return elt^=val; sl@0: } sl@0: sl@0: void CMD2Impl::DoUpdate(const TUint8* aData,TUint aLength) sl@0: { sl@0: TBool carryOn=ETrue; sl@0: if (iNum) sl@0: { sl@0: if (iNum+aLength>=(TUint)KMD2BlockSize) sl@0: { sl@0: const TUint temp=KMD2BlockSize-iNum; sl@0: (void)Mem::Copy(iData+iNum,aData,temp); sl@0: Block(iData); sl@0: aData+=temp; sl@0: aLength-=temp; sl@0: iNum=0; sl@0: } sl@0: else sl@0: { sl@0: (void)Mem::Copy(iData+iNum,aData,aLength); sl@0: iNum+=aLength; sl@0: carryOn=EFalse; sl@0: } sl@0: } sl@0: // processing by block of KMD2BlockSize sl@0: if (carryOn) sl@0: { sl@0: while (aLength>=(TUint)KMD2BlockSize) sl@0: { sl@0: Block(aData); sl@0: aData+=KMD2BlockSize; sl@0: aLength-=KMD2BlockSize; sl@0: } sl@0: (void)Mem::Copy(iData,aData,aLength); sl@0: iNum=aLength; sl@0: } sl@0: } sl@0: sl@0: void CMD2Impl::DoFinal() sl@0: { sl@0: const TUint pad=KMD2BlockSize-iNum; sl@0: if (pad>0) sl@0: Mem::Fill(iData+iNum,(TUint8)pad,pad); sl@0: Block(iData); sl@0: sl@0: TUint8* pData=iData; sl@0: const TUint8* pEnd=iData+KMD2BlockSize; sl@0: const TUint* pChecksum=iChecksum; sl@0: while (pData