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 hmac implementation sl@0: * software hmac implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: sl@0: #include "hmacimpl.h" sl@0: #include "pluginconfig.h" sl@0: #include "md2impl.h" sl@0: #include "md5impl.h" sl@0: #include "sha1impl.h" sl@0: #include "keys.h" sl@0: #include "md4impl.h" sl@0: sl@0: sl@0: using namespace SoftwareCrypto; sl@0: sl@0: CHMacImpl* CHMacImpl::NewL(const CKey& aKey, MSoftwareHash* aHash) sl@0: { sl@0: CHMacImpl* self=NewLC(aKey, aHash); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: CHMacImpl* CHMacImpl::NewLC(const CKey& aKey, MSoftwareHash* aHash) sl@0: { sl@0: CHMacImpl* self=new(ELeave) CHMacImpl(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aKey, aHash); sl@0: return self; sl@0: } sl@0: sl@0: CHMacImpl* CHMacImpl::NewL(MSoftwareHash* aHash) sl@0: { sl@0: CHMacImpl* self=NewLC(aHash); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: CHMacImpl* CHMacImpl::NewLC(MSoftwareHash* aHash) sl@0: { sl@0: CHMacImpl* self=new(ELeave) CHMacImpl(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aHash); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: CHMacImpl::CHMacImpl() sl@0: { sl@0: } sl@0: sl@0: CHMacImpl::CHMacImpl(const CHMacImpl& aMD) sl@0: : iDigest(NULL), iInnerPad(aMD.iInnerPad), sl@0: iOuterPad(aMD.iOuterPad), iBlockSize(aMD.iBlockSize) sl@0: { sl@0: } sl@0: sl@0: CHMacImpl::~CHMacImpl() sl@0: { sl@0: if (iDigest) sl@0: { sl@0: iDigest->Close(); sl@0: } sl@0: } sl@0: sl@0: void CHMacImpl::ConstructL(const CKey& aKey, MSoftwareHash* aHash) sl@0: { sl@0: //Clone the hash implementation sl@0: iDigest=static_cast(aHash->ReplicateL()); sl@0: InitBlockSizeL(); sl@0: const TDesC8& keyContent=aKey.GetTDesC8L(KHmacKeyParameterUid); sl@0: Initialise(keyContent); sl@0: } sl@0: sl@0: void CHMacImpl::ConstructL(MSoftwareHash* aHash) sl@0: { sl@0: //Clone the hash implementation sl@0: iDigest=static_cast(aHash->ReplicateL()); sl@0: InitBlockSizeL(); sl@0: } sl@0: sl@0: void CHMacImpl::InitBlockSizeL() sl@0: { sl@0: const TCharacteristics* ptr(NULL); sl@0: iDigest->GetCharacteristicsL(ptr); sl@0: const THashCharacteristics* hashPtr=static_cast(ptr); sl@0: iBlockSize = hashPtr->iBlockSize/8; sl@0: sl@0: iInnerPad.SetLength(iBlockSize); sl@0: iOuterPad.SetLength(iBlockSize); sl@0: iInnerPadCopy.SetLength(iBlockSize); sl@0: iOuterPadCopy.SetLength(iBlockSize); sl@0: } sl@0: sl@0: void CHMacImpl::Initialise(const TDesC8& aKey) sl@0: { sl@0: // initialisation sl@0: if (iDigest) sl@0: { sl@0: iDigest->Reset(); sl@0: if( (TUint32)aKey.Size() > iBlockSize) sl@0: { sl@0: iInnerPad = iDigest->Final(aKey); sl@0: } sl@0: else sl@0: { sl@0: iInnerPad = aKey; sl@0: } sl@0: sl@0: TUint i; sl@0: for (i=iInnerPad.Size();iHash(iInnerPad); sl@0: } sl@0: } sl@0: sl@0: MHash* CHMacImpl::CopyL() sl@0: { sl@0: CHMacImpl* that=new(ELeave) CHMacImpl(*this); sl@0: CleanupStack::PushL(that); sl@0: that->iDigest=iDigest ? static_cast(iDigest->CopyL()) : NULL; sl@0: CleanupStack::Pop(); sl@0: return that; sl@0: } sl@0: sl@0: MHash* CHMacImpl::ReplicateL() sl@0: { sl@0: CHMacImpl* that=new(ELeave) CHMacImpl(*this); sl@0: CleanupStack::PushL(that); sl@0: that->iDigest=iDigest ? static_cast(iDigest->ReplicateL()) : NULL; sl@0: that->Reset(); sl@0: CleanupStack::Pop(); sl@0: return that; sl@0: } sl@0: sl@0: void CHMacImpl::Reset() sl@0: { sl@0: if (iDigest) sl@0: { sl@0: iDigest->Reset(); sl@0: iDigest->Update(iInnerPad); sl@0: } sl@0: } sl@0: sl@0: TPtrC8 CHMacImpl::Hash(const TDesC8& aMessage) sl@0: { sl@0: TPtrC8 ptr(KNullDesC8()); sl@0: TPtrC8 finalPtr(KNullDesC8()); sl@0: StoreState(); sl@0: if (iDigest) sl@0: { sl@0: ptr.Set(iDigest->Final(aMessage)); sl@0: iDigest->Update(iOuterPad); sl@0: finalPtr.Set(iDigest->Final(ptr)); sl@0: } sl@0: sl@0: RestoreState(); sl@0: sl@0: if(iDigest) sl@0: { sl@0: iDigest->Update(aMessage); sl@0: } sl@0: sl@0: sl@0: sl@0: return (finalPtr); sl@0: } sl@0: sl@0: void CHMacImpl::Update(const TDesC8& aMessage) sl@0: { sl@0: if(iDigest) sl@0: { sl@0: iDigest->Update(aMessage); sl@0: } sl@0: } sl@0: sl@0: TPtrC8 CHMacImpl::Final(const TDesC8& aMessage) sl@0: { sl@0: TPtrC8 ptr(KNullDesC8()); sl@0: if(iDigest) sl@0: { sl@0: ptr.Set(iDigest->Final(aMessage)); sl@0: iDigest->Update(iOuterPad); sl@0: iDigest->Final(ptr); sl@0: Reset(); sl@0: } sl@0: return (ptr); sl@0: } sl@0: sl@0: void CHMacImpl::RestoreState() sl@0: { sl@0: iOuterPad.Copy(iOuterPadCopy); sl@0: iInnerPad.Copy(iInnerPadCopy); sl@0: if (iDigest) sl@0: { sl@0: iDigest->RestoreState(); sl@0: } sl@0: } sl@0: sl@0: void CHMacImpl::StoreState() sl@0: { sl@0: iOuterPadCopy.Copy(iOuterPad); sl@0: iInnerPadCopy.Copy(iInnerPad); sl@0: if (iDigest) sl@0: { sl@0: iDigest->StoreState(); sl@0: } sl@0: } sl@0: sl@0: void CHMacImpl::SetKeyL(const CKey& aKey) sl@0: { sl@0: const TDesC8& keyContent=aKey.GetTDesC8L(KHmacKeyParameterUid); sl@0: Initialise(keyContent); sl@0: } sl@0: sl@0: void CHMacImpl::Close() sl@0: { sl@0: delete this; sl@0: } sl@0: sl@0: void CHMacImpl::GetCharacteristicsL(const TCharacteristics*& aPluginCharacteristics) sl@0: { sl@0: iDigest->GetCharacteristicsL(aPluginCharacteristics); sl@0: } sl@0: sl@0: const CExtendedCharacteristics* CHMacImpl::GetExtendedCharacteristicsL() sl@0: { sl@0: return iDigest->GetExtendedCharacteristicsL(); sl@0: } sl@0: sl@0: // Methods which are not supported can be excluded from the coverage. 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* CHMacImpl::GetExtension(TUid /*aExtensionId*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: void CHMacImpl::SetOperationModeL(TUid /*aOperationMode*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: