diff -r 000000000000 -r 307788aac0a8 rtp/srtpstack/src/srtpcryptocontext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtp/srtpstack/src/srtpcryptocontext.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,370 @@ +/* +* Copyright (c) 2004 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: . +* +*/ + + + + +// INCLUDES +#include +#include "srtpmasterkey.h" +#include "srtpmastersalt.h" +#include "srtpcryptohandler.h" +#include "srtpdef.h" +#include "srtpcryptocontext.h" +#include "srtpcryptoparams.h" + + +// --------------------------------------------------------------------------- +// Two-phased constructor. Used when stream uses its own cryptographic context +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPCryptoContext* CSRTPCryptoContext::NewL( const CSRTPMasterKey* aKey, + const CSRTPMasterSalt* aSalt, + const TSrtpCryptoParams& aCryptoParams) + { + + + CSRTPCryptoContext* self = CSRTPCryptoContext::NewLC( aKey, + aSalt, + aCryptoParams ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. Used when stream uses its own cryptographic context +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPCryptoContext* CSRTPCryptoContext::NewLC( const CSRTPMasterKey* aKey, + const CSRTPMasterSalt* aSalt, + const TSrtpCryptoParams& aCryptoParams) + { + + CSRTPCryptoContext* self = new( ELeave )CSRTPCryptoContext( aCryptoParams ); + + + CleanupStack::PushL( self ); + self->ConstructL( aKey, aSalt ); + + return self; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::CSRTPCryptoContext +// --------------------------------------------------------------------------- +// +CSRTPCryptoContext::CSRTPCryptoContext( const TSrtpCryptoParams& aCryptoParams) : + iHandlerList(CSRTPCryptoHandler::iHandlerOffset), + iHandlerIter( iHandlerList ), + iCryptoParams (aCryptoParams) + + { + } + + +// ----------------------------------------------------------------------------- +// CSRTPCryptoContext::ConstructL +// ----------------------------------------------------------------------------- +// +void CSRTPCryptoContext::ConstructL( const CSRTPMasterKey* aKey, + const CSRTPMasterSalt* aSalt) + { + if( !aKey || !aSalt ) + { + User::Leave( KErrNoMemory ); + } + else + { + iKey = aKey; + iSalt = aSalt; + } + + if (!Valid()) + { + User::Leave(KErrArgument); + } + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::CSRTPCryptoContext +// --------------------------------------------------------------------------- +// +CSRTPCryptoContext::~CSRTPCryptoContext( ) + + { + delete iKey; iKey=NULL; + delete iSalt; iSalt=NULL; + iHandlerList.Reset(); + } + + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::SetMasterKey() +// --------------------------------------------------------------------------- +// +EXPORT_C void CSRTPCryptoContext::SetMasterKey(const CSRTPMasterKey* aKey) + { + if (iKey) + { + delete iKey; + iKey=NULL; + } + iKey = aKey; + + CSRTPCryptoHandler* handler; + iHandlerIter.SetToFirst(); + while( ( handler = iHandlerIter++ ) != NULL ) + { + handler->SRTPMasterKeyChanged(); + } + } + + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::SetMasterSalt() +// --------------------------------------------------------------------------- +// +EXPORT_C void CSRTPCryptoContext::SetMasterSalt(const CSRTPMasterSalt* aSalt) + { + if(iSalt) + { + delete iSalt; + iSalt = NULL; + } + iSalt = aSalt; + + CSRTPCryptoHandler* handler; + iHandlerIter.SetToFirst(); + while( ( handler = iHandlerIter++ ) != NULL ) + { + handler->SRTPMasterSaltChanged(); + } + } + + + + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::AddCryptoChangeObserver() +// --------------------------------------------------------------------------- +// + void CSRTPCryptoContext::AddCryptoChangeObserver(CSRTPCryptoHandler *aObserver) + { + iHandlerList.AddLast(*aObserver); + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::RemoveCryptoChangeObserver() +// --------------------------------------------------------------------------- +// + void CSRTPCryptoContext::RemoveCryptoChangeObserver(CSRTPCryptoHandler *aObserver) + { + if (!iHandlerList.IsEmpty() && FindHandler(aObserver)) + { + iHandlerList.Remove(*aObserver); + } + } +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::MasterKey() +// --------------------------------------------------------------------------- +// +EXPORT_C const CSRTPMasterKey& CSRTPCryptoContext::MasterKey() const + { + return *iKey; + } +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::MasterSalt() +// --------------------------------------------------------------------------- +// +EXPORT_C const CSRTPMasterSalt& CSRTPCryptoContext::MasterSalt() const + { + return *iSalt; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::CryptoParams() +// --------------------------------------------------------------------------- +// +EXPORT_C const TSrtpCryptoParams& CSRTPCryptoContext::CryptoParams() + { + return iCryptoParams; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::SetRCCm3Sync() +// --------------------------------------------------------------------------- +// +EXPORT_C void CSRTPCryptoContext::SetRCCm3Sync(TBool aSync) + { + iCryptoParams.iIsRCCm3Sync = aSync; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::IsEqual() +// --------------------------------------------------------------------------- +// +TBool CSRTPCryptoContext::IsEqual(const CSRTPCryptoContext& aContext) + { + TBool isEqual= EFalse; + if (!aContext.iKey->iKey->Compare(iKey->iKey->Des()) && + !aContext.iSalt->iKey->Compare(iSalt->iKey->Des()) && + !aContext.iKey->iMKI->Compare(iKey->iMKI->Des())) + { + if (aContext.iCryptoParams.iSrtpEncAlg==iCryptoParams.iSrtpEncAlg && + aContext.iCryptoParams.iSrtpEncAlg==iCryptoParams.iSrtcpEncAlg && + aContext.iCryptoParams.iSrtpAuthAlg==iCryptoParams.iSrtpAuthAlg && + aContext.iCryptoParams.iSrtcpAuthAlg==iCryptoParams.iSrtcpAuthAlg && + aContext.iCryptoParams.iSrtpAuthTagLen==iCryptoParams.iSrtpAuthTagLen && + aContext.iCryptoParams.iSrtcpAuthTagLen==iCryptoParams.iSrtcpAuthTagLen && + aContext.iCryptoParams.iSrtpKeyDervRate==iCryptoParams.iSrtpKeyDervRate && + aContext.iCryptoParams.iSrtcpKeyDervRate==iCryptoParams.iSrtcpKeyDervRate && + aContext.iCryptoParams.iSrtpReplayProtection==iCryptoParams.iSrtpReplayProtection && + aContext.iCryptoParams.iSrtcpReplayProtection==iCryptoParams.iSrtcpReplayProtection && + aContext.iCryptoParams.iROCTransRate==iCryptoParams.iROCTransRate && + aContext.iCryptoParams.iMasterKeysLifeTime==iCryptoParams.iMasterKeysLifeTime && + aContext.iCryptoParams.iReplayWindowSizeHint==iCryptoParams.iReplayWindowSizeHint && + aContext.iCryptoParams.iIsRCCm3Sync==iCryptoParams.iIsRCCm3Sync) + return !isEqual; + } + return isEqual; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::operator= +// --------------------------------------------------------------------------- +// +const CSRTPCryptoContext& CSRTPCryptoContext::operator=(const CSRTPCryptoContext& aContext) + { + return aContext; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::UpdateCryptoParams +// --------------------------------------------------------------------------- +// +void CSRTPCryptoContext::UpdateCryptoParams(const TSrtpCryptoParams& aCryptoParams ) + { + iCryptoParams = aCryptoParams; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::FindCryptoHandler +// --------------------------------------------------------------------------- +// + +TBool CSRTPCryptoContext::FindHandler( CSRTPCryptoHandler *aObserver ) + { + TBool found=EFalse; + CSRTPCryptoHandler* handler=NULL; + + iHandlerIter.SetToFirst(); + handler =iHandlerIter; + while ((handler=iHandlerIter++)!=NULL) + { + if (handler == aObserver) + { + found = ETrue; + return found; + } + } + return found; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoContext::Valid() +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CSRTPCryptoContext::Valid() const + { + if (!(iKey->Valid())) + { + return EFalse; + } + + if (!(iSalt->Valid())) + { + return EFalse; + } + + if ((iCryptoParams.iSrtpEncAlg!=EEncAES_CM && + iCryptoParams.iSrtpEncAlg!=ENullAlg) ||( + iCryptoParams.iSrtcpEncAlg!=EEncAES_CM && + iCryptoParams.iSrtcpEncAlg!=ENullAlg)) + { + return EFalse; + } + + if ((iCryptoParams.iSrtpAuthAlg!=EAuthHMAC_SHA1 && + iCryptoParams.iSrtpAuthAlg!=EAuthNull && + iCryptoParams.iSrtpAuthAlg!=EAuthRCCm1 && + iCryptoParams.iSrtpAuthAlg!=EAuthRCCm2 && + iCryptoParams.iSrtpAuthAlg!=EAuthRCCm3 ) || + (iCryptoParams.iSrtcpAuthAlg!=EAuthHMAC_SHA1 && + iCryptoParams.iSrtcpAuthAlg!=EAuthNull )) + { + return EFalse; + } + if (iCryptoParams.iSrtpAuthAlg==EAuthHMAC_SHA1 && + (iCryptoParams.iSrtpAuthTagLen!=KSRTPAuthTagLength80 && + iCryptoParams.iSrtpAuthTagLen!=KSRTPAuthTagLength32 + )) + { + return EFalse; + } + + if (iCryptoParams.iSrtcpAuthAlg==EAuthHMAC_SHA1 && + (iCryptoParams.iSrtcpAuthTagLen!=KSRTPAuthTagLength80 && + iCryptoParams.iSrtcpAuthTagLen!=KSRTPAuthTagLength32 + )) + { + return EFalse; + } + if ((iCryptoParams.iSrtpAuthAlg==EAuthRCCm1 || + iCryptoParams.iSrtpAuthAlg==EAuthRCCm2 ) && + iCryptoParams.iSrtpAuthTagLen != KSRTPAuthTagLength112) + { + return EFalse; + } + if (iCryptoParams.iSrtpAuthAlg==EAuthRCCm3 && + iCryptoParams.iSrtpAuthTagLen != KSRTPAuthTagLength32) + { + return EFalse; + } + if ((iCryptoParams.iSrtpAuthAlg==EAuthNull && + iCryptoParams.iSrtpAuthTagLen != 0)||( + iCryptoParams.iSrtcpAuthAlg==EAuthNull && + iCryptoParams.iSrtcpAuthTagLen != 0)) + { + return EFalse; + } + + if (iCryptoParams.iPrefixLen!=KSRTPPrefixLength) + { + return EFalse; + } + + if (!iCryptoParams.iROCTransRate) + { + return EFalse; + } + + return ETrue; + } +