diff -r 000000000000 -r 307788aac0a8 rtp/srtpstack/inc/srtpcryptohandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtp/srtpstack/inc/srtpcryptohandler.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,252 @@ +/* +* 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: Contains a cryptographic handler for SRTP/SRTCP streams. +* +*/ + + + + +#ifndef __SRTP_CRYPTOHANDLER_H__ +#define __SRTP_CRYPTOHANDLER_H__ + +// INCLUDES +#include +#include "srtpdef.h" +#include "msrtpcryptohandlercontext.h" +#include "srtpcryptocontext.h" +#include "srtpcryptoparams.h" + +// FORWARD DECLARATIONS +class CSRTPMasterKey; +class CSRTPMasterSalt; +class CSRTPCryptoContext; +class CSRTPStream; +class MSRTPCipher; +class MSRTPKeyDerivation; +class MSRTPAuthentication; +class CSRTPPacket; + +/** +* Contains RTP/RTCP common handling of cryptographic context. +*/ +class CSRTPCryptoHandler : public CBase, public MSRTPCryptoHandlerContext + { + + public: // from MSRTPCryptoHandlerContext + + /* + * virtual function for initializing + * plain packet class (CSRTPPacketRTP or CSRTPPacketRTCP) + * @param aPacket RTP/RTCP packet. + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void InitializePlainPacketL(const TDesC8& aPacket)=0; + + /* + * virtual function for initializing + * encrypted packet class (CSRTPPacketSRTP or CSRTPPacketSRTCP) + * @param aPacket SRTP/SRTCP packet. + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void InitializeEncryptedPacketL(const TDesC8& aPacket)=0; + /* + * Virtual function for deriving session + * encryption, salting and authentication keys + * for RTP or RTCP + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void DeriveSessionKeysL()=0; + + /* + * virtual function for checking that crypto context MKI and + * packet MKI match. + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void CheckMasterKeyIdentifierL()=0; + + /* + * virtual function for performing the authentication step + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void AuthenticateL()=0; + + /* + * virtual function for performing the replay protection step + * @leave KErrNone if success, system-wide error code otherwise + * @return void + */ + virtual void ReplayProtectionL()=0; + + /* + * virtual function for encrypting plain packet + * @leave KErrNone if success, system-wide error code otherwise + * @return encrypted packet + */ + virtual HBufC8* EncryptL()=0; + + /* + * virtual function for decrypting ciphered packet + * @leave KErrNone if success, system-wide error code otherwise + * @return plain packet + */ + virtual HBufC8* DecryptL()=0; + + /* + * function for querying whether master key or salt has been updated + * @return master keys update status + */ + virtual TBool MasterKeysUpdated()=0; + + public: // from CSRTPCryptoContext + /** + * Callback from CSRTPCryptoContext when a master key is changed. + */ + void SRTPMasterKeyChanged(); + /** + * Callback from CSRTPCryptoContext when a master salt is changed. + */ + void SRTPMasterSaltChanged(); + + + + public: + /** + * Get roll-over counter value. + * @return current ROC value. + */ + TUint32 ROC( ) const; + /* + * Get corresponding CSRTPCryptoContext + * (either session or stream specific) + * @return CSRTPCryptoContext + */ + CSRTPCryptoContext& Context(); + + const TSrtpCryptoParams& CryptoParams(); + + virtual ~CSRTPCryptoHandler( ); + + protected: // methods + + CSRTPCryptoHandler( CSRTPStream& aStream); + + void ConstructL( ); + + + /* + * Deletes session keys (encryption, + * salting and authentication) and sets them NULL + * @return void + */ + void DeleteSessionKeys(); + + /** + * Set roll-over counter value. + * @param aROC The new ROC value. + * @return void + */ + void SetROC( TUint32 aROC ); + + /** + * Get 32 bit SSRC value + * @return SSRC + */ + TUint SSRC() const; + + /* + * Count X value, + * which used in session key derivation + * Common to RTP and RTCP. + * The length of X is the same as master key length + * (padding will be performed later) + * @param a_R, r, index DIV key_derivation_rate + * @param aLabel, label 8 bit RTP/RTCP label + * @param aIndexLength, + * @param &aRes resulting n bit x value + * @return void + */ + void Count_X(TUint64 a_R, + TInt8 aLabel, + const TUint64 aIndexLength, + TDes8 &aRes); + + + + /* + * Check Packet Index with Replay window + * Common for RTP and RTCP. + * @param aDelta the difference between the stored packet Index and + * current Packet Index + * @return KErrNone if checks Ok, if not, return KErrArgument + */ + TInt ReplayCheck(TInt aDelta) ; + + /* + * Set Encryptor and Auth + * Common for RTP and RTCP. + * @param aEngAlg Encrption Alg using for cryptor handler + * @param aAuthAlg Authentication Algorithem using for crypto handler + * @return void + */ + void SetEncAndAuthL (TSRTPEncAlg aEngAlg, + TSRTPAuthAlg aAuthAlg); + + public: + /** + * iHandlerOffset, List offset. + * Owned by CCryptoContext object. + */ + static const TInt iHandlerOffset; + + /** + * iHandlerLink, Link to list. + * Owned by CSRTPCryptoHandler object. + */ + TSglQueLink iHandlerLink; + + protected: // data + + CSRTPStream& iStream; // stream + + CSRTPPacket* iCurrentPacket; // packet class + // algorithms: + MSRTPKeyDerivation* iKeyDeriver; // key divider algorithm + MSRTPAuthentication* iAuthenticator; // authentication algorithm + MSRTPCipher* iCipher; // encryption/decryption alg. + TBool iMasterDataUpdated; // is master key or salt updated + + // session keys: + HBufC8* iSessionEncrKey; // session encryption/decryption key (k_e) + HBufC8* iSessionAuthKey; // session authentication key (k_a) + HBufC8* iSessionSaltKey; // session salting key (k_s) + TBool iReKey; // is master key or salt updated + TUint64 iBitmap; //Replay List + TUint64 iNumPackets; //Number of packets has been recived / sending + + private: + #ifdef EUNIT_TESTING + friend class UT_CSRTPCryptoHandler; + friend class UT_CSRTPCryptoHandlerSRTP; + friend class UT_CSRTPStreamIn; + friend class UT_CSRTPStreamOut; + #endif + + }; +#endif // __SRTP_CRYPTOHANDLER_H__