diff -r 000000000000 -r 1bce908db942 natfw/natfwstunturnclient/src/ctransactionidgenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natfw/natfwstunturnclient/src/ctransactionidgenerator.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,195 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + + +#include +#include +#include "stunassert.h" +#include "ctransactionidgenerator.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::NewL +// --------------------------------------------------------------------------- +// +CTransactionIDGenerator* CTransactionIDGenerator::NewL() + { + return new ( ELeave ) CTransactionIDGenerator(); + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::CTransactionIDGenerator +// --------------------------------------------------------------------------- +// +CTransactionIDGenerator::CTransactionIDGenerator() + { + TUint ticks = User::TickCount(); + TTime now; + now.UniversalTime(); + TInt64 us = now.Int64(); + + iSeed = static_cast( ticks ) + us; + iCounter = I64LOW( us ) - ticks; + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::CTransactionIDGenerator +// Dummy implementation, as copy constructor is declared private and not used. +// --------------------------------------------------------------------------- +// +CTransactionIDGenerator::CTransactionIDGenerator( + const CTransactionIDGenerator& /*aTransactionIDGenerator*/ ) : + CBase() + { + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::~CTransactionIDGenerator +// --------------------------------------------------------------------------- +// +CTransactionIDGenerator::~CTransactionIDGenerator() + { + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::GetIDL +// CMD5 exists only during hash computing, to save memory. +// --------------------------------------------------------------------------- +// +void CTransactionIDGenerator::GetIDL( TAny* aObject, + TInt aObjectSize, + TNATFWUNSAFTransactionID& aTransactionID ) + { + ++iCounter; + HBufC8* data = BuildInputDataLC( aObject, aObjectSize ); + + CMD5* md5 = CMD5::NewL(); + CleanupStack::PushL( md5 ); + TPtrC8 hash = md5->Hash( *data ); + + __STUN_ASSERT_L( md5->HashSize() >= KMaxNATFWUNSAFTransactionIdLength, + KErrUnderflow ); + TPtrC8 ptrToHash = hash.Left(KMaxNATFWUNSAFTransactionIdLength); + aTransactionID = ptrToHash; + + CleanupStack::PopAndDestroy( md5 ); + CleanupStack::PopAndDestroy( data ); + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::BuildInputDataL +// --------------------------------------------------------------------------- +// +HBufC8* CTransactionIDGenerator::BuildInputDataLC( TAny* aObject, + TInt aObjectSize ) + { + const TInt KAmountOfRandomNbrsToFill = 10; + + //Size of the input data buffer. It contains the following items: + // + //item item's size + //---- ----------- + //iCounter sizeof( iCounter ) + //aObject's state aObjectSize + //checksum of this sizeof( TUint16 ) + //clock info sizeof( TInt64 ) + sizeof( TUint ) + //system info sizeof( TUint16 ) + sizeof( TUint8 ) + //KAmountOfRandomNbrsToFill + //random integer values KAmountOfRandomNbrsToFill * sizeof( TInt ) + TInt dataSize = sizeof( iCounter ) + aObjectSize + + sizeof( TUint16 ) + sizeof( TInt64 ) + sizeof( TUint ) + + sizeof( TUint16 ) + sizeof( TUint8 ) + + KAmountOfRandomNbrsToFill * sizeof( TInt ); + HBufC8* buf = HBufC8::NewLC( dataSize ); + + TPtr8 ptr = buf->Des(); + + ptr.Append( reinterpret_cast( &iCounter ), + sizeof( iCounter ) ); + ptr.Append( reinterpret_cast( aObject ), aObjectSize ); + + ComputeChecksum( ptr, this, sizeof( this ) ); + + AddClockInfo( ptr ); + AddSystemInfo( ptr ); + + TInt random = 0; + TInt randomNumberSize = sizeof( random ); + while ( ptr.Size() <= ( ptr.MaxSize() - randomNumberSize ) ) + { + random = Math::Rand( iSeed ); + ptr.Append( reinterpret_cast( &random ), + sizeof( random ) ); + } + + return buf; + } + +// ----------------------------------------------------------------------------- +// CTransactionIDGenerator::AddClockInfo +// ----------------------------------------------------------------------------- +// +void CTransactionIDGenerator::AddClockInfo( TDes8& aBuf ) const + { + TTime now; + now.UniversalTime(); + TInt64 timeAsInt = now.Int64(); + + aBuf.Append( reinterpret_cast( &timeAsInt ), + sizeof( timeAsInt ) ); + + TUint ticks = User::TickCount(); + aBuf.Append( reinterpret_cast( &ticks ), sizeof( ticks ) ); + } + +// ----------------------------------------------------------------------------- +// CTransactionIDGenerator::AddSystemInfo +// ----------------------------------------------------------------------------- +// +void CTransactionIDGenerator::AddSystemInfo( TDes8& aBuf ) const + { + TInt biggestBlock = 0; + TInt totalAvailable = User::Available( biggestBlock ); + TInt value = biggestBlock + totalAvailable - User::CountAllocCells(); + ComputeChecksum( aBuf, &value, sizeof( value ) ); + + TTimeIntervalSeconds inactivity = User::InactivityTime(); + if ( inactivity.Int() > 0 ) + { + TUint8 byteVal = static_cast( inactivity.Int() & 0xff ); + aBuf.Append( &byteVal, sizeof( byteVal ) ); + } + } + +// --------------------------------------------------------------------------- +// CTransactionIDGenerator::ComputeChecksum +// --------------------------------------------------------------------------- +// +void CTransactionIDGenerator::ComputeChecksum( TDes8& aBuf, + const TAny* aPtr, + TInt aLength ) const + { + __STUN_ASSERT_RETURN( aPtr != NULL, KErrArgument ); + + TUint16 cs = 0; + Mem::Crc( cs, aPtr, aLength ); + aBuf.Append( reinterpret_cast( &cs ), sizeof( cs ) ); + }