diff -r 000000000000 -r 307788aac0a8 rtp/srtpstack/src/srtpcryptohandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtp/srtpstack/src/srtpcryptohandler.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,289 @@ +/* +* 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 "srtpcryptohandler.h" +#include "srtpcryptocontext.h" +#include "srtputils.h" +#include "srtpstream.h" +#include "srtpaesctrcrypto.h" +#include "srtpkeyderivation_aescm128.h" +#include "srtpcipher_aescm128.h" +#include "srtpcipher_null.h" +#include "srtpauthentication_hmac_sha1.h" +#include "srtpauthentication_null.h" +#include "srtpauthentication_rcc.h" +#include "srtppacket.h" +#include "srtpmasterkey.h" +#include "srtpmastersalt.h" + +// CONSTANTS +const TInt CSRTPCryptoHandler::iHandlerOffset = _FOFF( CSRTPCryptoHandler, iHandlerLink ); + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::CSrtpCryptoHandler +// --------------------------------------------------------------------------- +// +CSRTPCryptoHandler::CSRTPCryptoHandler( CSRTPStream& aStream ) : + iStream(aStream), + iCurrentPacket(NULL), + iKeyDeriver(NULL), + iAuthenticator(NULL), + iCipher(NULL), + iMasterDataUpdated(EFalse), + iSessionEncrKey(NULL), + iSessionAuthKey(NULL), + iSessionSaltKey(NULL), + iReKey(EFalse), + iBitmap(NULL), + iNumPackets(NULL) + { + + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::~CSrtpCryptoHandler +// --------------------------------------------------------------------------- +// +CSRTPCryptoHandler::~CSRTPCryptoHandler( ) + { + if (&Context()) + { + Context().RemoveCryptoChangeObserver(this); + } + + delete iCurrentPacket; iCurrentPacket=NULL; + delete iKeyDeriver; iKeyDeriver=NULL; + delete iCipher; iCipher=NULL; + delete iAuthenticator; iAuthenticator=NULL; + + DeleteSessionKeys(); + } + +// --------------------------------------------------------------------------- +// void CSRTPCryptoHandler::SRTPMasterKeyChanged() +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::SRTPMasterKeyChanged() + { + iMasterDataUpdated = ETrue; + //RFC 3711 8.1 + iReKey= EFalse; + } + +// --------------------------------------------------------------------------- +// void CSRTPCryptoHandler::SRTPMasterSaltChanged() +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::SRTPMasterSaltChanged() + { + iMasterDataUpdated = ETrue; + + } + + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::ConstructL +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::ConstructL( ) + { + if (!Context().Valid()) + { + User::Leave(KErrArgument); + } + Context().AddCryptoChangeObserver(this); + + iKeyDeriver = CSRTPKeyDerivation_AESCM128::NewL(); + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::SetEncAndAlg (); +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::SetEncAndAuthL (TSRTPEncAlg aEngAlg, + TSRTPAuthAlg aAuthAlg) + { + delete iCipher; iCipher=NULL; + delete iAuthenticator; iAuthenticator=NULL; + switch (aEngAlg) + { + case EEncAES_CM: + { + iCipher = CSRTPCipherAESCM128::NewL(); + break; + } + case ENullAlg: + { + iCipher = CSRTPCipherNULL::NewL(); + break; + } + default: + { + User::Leave(KErrNotSupported); + } + } + + switch (aAuthAlg) + { + case EAuthHMAC_SHA1: + + { + iAuthenticator = CSRTPAuthentication_HMAC_SHA1::NewL(); + break; + } + case EAuthNull: + case EAuthRCCm3: + { + iAuthenticator = CSRTPAuthentication_NULL::NewL(); + break; + } + case EAuthRCCm1: + case EAuthRCCm2: + { + iAuthenticator = CSrtpAuthentication_RCC::NewL(); + break; + } + + default: + { + User::Leave(KErrNotSupported); + } + } + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::Context() +// --------------------------------------------------------------------------- +// +CSRTPCryptoContext& CSRTPCryptoHandler::Context() + { + return iStream.GetCryptoContext(); + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::CryptoParams() +// --------------------------------------------------------------------------- +// +const TSrtpCryptoParams& CSRTPCryptoHandler::CryptoParams() + { + return Context().CryptoParams(); + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::DeleteSessionKeys() +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::DeleteSessionKeys() + { + delete iSessionEncrKey; + delete iSessionAuthKey; + delete iSessionSaltKey; + iSessionEncrKey = NULL; + iSessionAuthKey = NULL; + iSessionSaltKey = NULL; + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::Count_X() +// --------------------------------------------------------------------------- +// +void CSRTPCryptoHandler::Count_X(TUint64 a_R, + TInt8 aLabel, + const TUint64 aIndexLength, + TDes8 &aRes) + { + + TUint64 key_id = TSRTPUtils::Cnt_key_id(aLabel, a_R, aIndexLength); + + TSRTPUtils::Cnt_x(key_id, aRes, Context().MasterSalt().MasterSalt()); + + } + + + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::SetROC() +// +// --------------------------------------------------------------------------- +// + +void CSRTPCryptoHandler::SetROC( TUint32 aROC ) + { + iStream.SetROC(aROC); + } + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::ROC +// +// --------------------------------------------------------------------------- +// +TUint32 CSRTPCryptoHandler::ROC() const + { + return iStream.ROC(); + } + + +// --------------------------------------------------------------------------- +// CSRTPCryptoHandler::SSRC +// +// --------------------------------------------------------------------------- +// +TUint CSRTPCryptoHandler::SSRC() const + { + return iStream.SSRC(); + } + + + +// --------------------------------------------------------------------------- +// TInt CSRTPCryptoHandler::ReplayCheck() +// --------------------------------------------------------------------------- +// +TInt CSRTPCryptoHandler::ReplayCheck(TInt aDelta) + { + TInt replayWSH= KReplayWindowSize; + if (CryptoParams().iReplayWindowSizeHint!=replayWSH) + { + replayWSH= CryptoParams().iReplayWindowSizeHint; + } + //Remember to initial bitmask at the first time + //if aDelta ==0 it might be just re-sent + if (aDelta > 0) + { + /* new larger sequence number */ + + if (aDelta < replayWSH) + { /* In window */ + iBitmap <<= aDelta; + iBitmap |= 1; /* set bit for this packet */ + } else iBitmap = 1; /* This packet has a "way larger" */ + + return KErrNone; /* larger is good */ + } + TInt diff= -(aDelta); + if (diff >= replayWSH) return KErrArgument; /* too old or wrapped */ + + if (iBitmap & ((TUint64)1 << diff)) return KErrArgument; /* already seen */ + //if none of above then will mark as seen in the AddReplayIndex() function + return KErrNone; /* out of order but good */ + + }