rtp/srtpstack/inc/srtpcryptohandlersrtp.h
changeset 0 307788aac0a8
child 11 c1efdb9c339d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp/srtpstack/inc/srtpcryptohandlersrtp.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,255 @@
+/*
+* 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 an SRTP specific cryptographic context.
+*
+*/
+
+
+
+
+#ifndef __SRTP_CRYPTOHANDLER_SRTP_H__
+#define __SRTP_CRYPTOHANDLER_SRTP_H__
+
+// INCLUDES
+#include <e32base.h>
+#include "srtpcryptocontext.h"
+#include "srtpcryptohandler.h"
+#include "msrtpcryptohandlercontextrtp.h"
+
+
+// FORWARD DECLARATIONS
+class CSRTPStream;
+
+/**
+* Contains RTP specific handling of cryptographic context.
+*/
+class CSRTPCryptoHandlerSRTP : public CSRTPCryptoHandler,
+                                public MSRTPCryptoHandlerContextRTP
+    {
+    public: // Construction
+        /**
+        * Two-phased constructor.
+        * @param aStream  aStream for this cryptohandler.
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        static CSRTPCryptoHandlerSRTP* NewL( CSRTPStream& aStream );
+        /**
+        * Two-phased constructor.
+        * @param aStream  aStream for this cryptohandler.
+        * @leave KErrNone if success, system-wide error code otherwise  
+        */
+        static CSRTPCryptoHandlerSRTP* NewLC( CSRTPStream& aStream);
+               
+ 
+
+        /**
+        * Calculate authentication tag for an RTP packet.
+        * Authentication is based on the current 
+        * TSRTPAuthAlg algorithm setting in CryptoContext
+        * If the operation fails, the function leaves
+        * with a system error code.
+        * @leave KErrNone if success, system-wide error code otherwise,
+        */
+        HBufC8* CalculateAuthTagL();
+
+        ~CSRTPCryptoHandlerSRTP( );
+        
+               
+   private: // from MSRTPCryptoHandlerContext
+        /*
+        * Initialize plain packet class (CSRTPPacketRTP) 
+        * @param aPacket   RTP packet.
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void
+        */        
+        void InitializePlainPacketL(const TDesC8& aPacket);
+
+        /*
+        * Initialize encrypted packet class (CSRTPPacketSRTP) 
+        * @param aPacket   SRTP packet.
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void
+        */        
+        void InitializeEncryptedPacketL(const TDesC8& aPacket);
+
+        /* 
+        * Derive session encryption, salting and authentication keys
+        * for RTP        
+        * @return void                
+        */
+        void DeriveSessionKeysL();
+        
+        /*
+        * Encrypt plain RTP packet
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return encrypted packet
+        */        
+        HBufC8* EncryptL();
+        
+        /*
+        * Decrypt ciphered SRTP packet
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return plain packet
+        */        
+        HBufC8* DecryptL();        
+        
+        /*
+        * Check that crypto context MKI and 
+        * packet MKI match.
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void
+        */        
+        void CheckMasterKeyIdentifierL();
+
+        /*
+        * Perform the authentication step
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void
+        */        
+        void AuthenticateL();
+        
+        /*
+        * Perform the replay protection step
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void
+        */        
+        void ReplayProtectionL();
+       
+        /*
+        * function for querying whether master key or salt has been updated
+        * @return master keys update status
+        */        
+        TBool MasterKeysUpdated();
+
+        /*
+        * function for updating Replay index after ReplayProtection Check
+        * @return void
+        */            
+        void AddReplayIndex() ;
+        
+        
+    private: // from MSRTPCryptoHandlerContextRTP
+        /*
+        * Determines the index i
+        * of an SRTP packet with given sequence number SEQ on sender's side.         
+        * @return void        
+        */
+        void CountSenderPacketIndexL();        
+
+        /*
+        * Implements pseudocode on RFC 3711 Appendix A
+        * for determining the index i of an SRTP packet with given sequence number SEQ
+        * and current s_l value in receiver side
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void                
+        */
+        void CountReceiverPacketIndexL();        
+
+        /*
+        * Assign receiver counter s_l to the value of first sequence number. 
+        * @return void                
+        */
+        void SetReceiver_s_l();        
+
+        /*
+        * Conditionally update ROC in sender's side:
+        * Each time SEQ wraps MOD 2^16, the sender side must 
+        * increment ROC by one MOD 2^32.
+        * @return void                
+        */
+        void UpdateROC();        
+
+        /*
+        * Conditionally update s_l and ROC based on v value. 
+        * See RFC 3711 section 3.3.1 for more information
+        * @leave KErrNone if success, system-wide error code otherwise
+        * @return void                
+        */
+        void Update_s_l_and_RocL();
+        
+       /*
+        * Add auth tag to the given packet.
+        * @param aSrtpPacketPtr  packet pointer
+        * @leave KErrNone if success, system-wide error code otherwise,
+        * @return void
+        */
+        void AddAuthTagToPacketL(TUint8* aSrtpPacketPtr); 
+        
+        /*
+        * Check if packets is carrying Roll-Over Counter
+        * @return TBool return True if it should carry, otherwise return False.
+        */
+        TBool CarryROC();    
+        
+        /*
+        * Call AuthenticateL in MSRTPAuthentication -interface
+        * to get authentication tag based on algorithm
+        * that is currently set in crypto context
+        * @param aAuthenticatedArea  portion of data to be authenticated
+        * @param aRoc Roll-Over counter 
+        * @leave KErrNone if success, system-wide error code otherwise,
+        * @return authentication tag 
+        */
+        HBufC8* DoAuthenticationL(const TDesC8& aAuthenticatedArea,
+        						 const TDesC8& aRoc);
+      private: // methods   
+
+        /*
+        * Count IV and transform payload
+        * @return HBufC8*, transformed encrypted / decrypted paylod
+        */    
+        HBufC8* CountIV_And_TransformL();
+
+        /*
+        * Add MKI to the given packet.
+        * Common for RTP and RTCP.
+        * @param aSrtpPacketPtr  packet pointer
+        * @return void
+        */
+        void AddMKIToPacket(TUint8* aSrtpPacketPtr); 
+         
+        
+        /*
+        * Count sender packet index when receiving the packet under RCC mode 1
+        * based on the attached sender ROC
+        * @return TUint64 sender packet index.
+        */              
+        TInt64 CountSndIndxbySndROC();
+                                               
+        void ConstructL();
+
+        void ReKeyCheck();
+        
+        TBool CSRTPCryptoHandlerSRTP::IfAddAuthTag();
+        
+        CSRTPCryptoHandlerSRTP( CSRTPStream& aStream );
+                     
+        
+    private: // data
+        TUint32                     iROC;            // //only using when RCC mode as sender Roc
+        TUint16                     iS_L;           // s_l, highest received SEQ   
+        TUint16                     iCurrentSeq;     // current sequence number  
+        TUint64                     iPktIndex;       //packet index
+        TInt32                      iV;             // local v value
+        TInt						iReplayIndexDelta;
+		TUint64			  			iSRTPMasterKeyLifeTime;
+    private:
+    #ifdef EUNIT_TESTING
+        friend class UT_CSRTPCryptoHandlerSRTP;
+        friend class UT_CSRTPCryptoHandler;
+    #endif 
+        
+    };
+
+#endif // __SRTP_CRYPTOHANDLER_SRTP_H__