ipappprotocols_plat/srtp_api/inc/srtpsession.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipappprotocols_plat/srtp_api/inc/srtpsession.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,263 @@
+/*
+* 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:    SRTP session class
+*
+*/
+
+
+
+
+#ifndef __SRTP_SESSION_H__
+#define __SRTP_SESSION_H__
+
+// INCLUDES
+#include <in_sock.h>
+// FORWARD DECLARATIONS
+class CSRTPStream;
+class CSRTPCryptoContext;
+class MSRTPReKeyingObserver;
+
+/**
+* Contains an SRTP session
+*/
+class CSRTPSession : public CBase
+    {
+    public: // construction
+        /**
+        * Two-phased constructor.
+        * Use this function if each stream will have its own cryptographic
+        * context.
+        * @param aDestination  The destination address, including the port.
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        IMPORT_C static CSRTPSession* NewL(const TInetAddr& aDestination );
+
+        /**
+        * Two-phased constructor.
+        * Use this function if all streams will use the same cryptographic
+        * context.
+        * @param aDestination  The destination address, including the port
+        * @param aCon  The default cryptographic context for the session,
+        *              ownership is transferred.
+        * @param aObs  The callback object
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        IMPORT_C static CSRTPSession* NewL( const TInetAddr& aDestination,
+                                     CSRTPCryptoContext* aCon,
+                                     MSRTPReKeyingObserver& aObs );
+
+        /**
+        * Two-phased constructor. Creates a new CSRTPSession instance 
+        * and pushes it to CleanupStack.
+        * Use this function if each stream will have its own cryptographic
+        * context.
+        * @param aDestination  The destination address, including the port.
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        IMPORT_C static CSRTPSession* NewLC(const TInetAddr& aDestination );
+
+        /**
+        * Two-phased constructor. Creates a new CSRTPSession instance 
+        * and pushes it to CleanupStack.
+        * Use this function if all streams will use the same cryptographic
+        * context.
+        * @param aDestination  The destination address, including the port
+        * @param aCon  The default cryptographic context for the session,
+        *              ownership is transferred.
+        * @param aObs  The callback object
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        IMPORT_C static CSRTPSession* NewLC(const TInetAddr& aDestination,
+                                     CSRTPCryptoContext* aCon,
+                                     MSRTPReKeyingObserver& aObs);
+        /**
+        * Destructor, remove and delete all the stream in the session
+        */
+        ~CSRTPSession();
+
+        /**
+        * Retrieve CSSRTPStream object associated with given SSRC.
+        * Note that if there are any duplicates the first one is returned.
+        * Otherwise, Multiple SRTP streams with identical SSRCs and with same 
+        * stream type (In/Out stream) are not supported.
+        * @param aSSRC - [input] SSRC of interest
+        * @param aInInStream - True if stream type is CStreamIn, False otherwise
+        * @return CSSRTPStream object if successful; Leave if not found.
+        */
+	    IMPORT_C CSRTPStream& StreamL(TUint aSSRC, TBool aIsInStream);
+
+        /**
+        * Session should find the match stream and protect stream
+        * Note that if there are no matching stream, the function leave
+        * @param aSSRC - [input] SSRC of interest
+        * @param aPacket - [input] packet to be protected, the length of descriptor
+        *  should be the same with the actual data, otherwise encoding will not be 
+        *  correct.        
+        * @return HBufC8 protected packet
+        */
+		IMPORT_C HBufC8* ProtectRTPL(TUint aSSRC, const TDesC8& aPacket);
+		
+		
+        /**
+        * Session should find the match stream and protect packet
+        * Note that if there are no matching stream, the function leave
+        * @param aSSRC - [input] SSRC of interest
+        * @param aPacket - [input] packet to be protected, the length of descriptor
+        *  should be the same with the actual data.              
+        * @return HBufC8 protected packet
+        */
+		IMPORT_C HBufC8* ProtectRTCPL(TUint aSSRC, const TDesC8& aPacket);
+		
+				
+        /**
+        * SRTPSession find the match stream and unprotect stream
+        * Note that if there are no matching stream, the function leave
+        * In late binding cases, session will try to find the stream 
+        * which SSRC is equal to zero and unprotect the packet. 
+        * If the autenticate for the packet is successful, SSRC will be set to this stream.
+        * @param aSSRC - [input] SSRC of interest
+        * @param aPacket - [input] packet to be Unprotected      
+        * @return HBufC8 Unprotected packet
+        */		
+		IMPORT_C HBufC8* UnprotectRTPL(TUint aSSRC, const TDesC8& aPacket);
+		
+       /**
+        * SRTPSession find the match stream and unprotect packet
+        * Note that if there are no matching stream, the function leaves
+        * SRTP must have been recive earlier otherwise the function will leave
+        * with KErrNotFound--no SSRC matching stream found
+        * Note that the streamIn must have to be created to receive RTCP report if 
+        * there is only one streamOut.
+        * @param aSSRC - [input] SSRC of interest
+        * @param aPacket - [input] packet to be Unprotected      
+        * @return HBufC8 Unprotected packet
+        */		
+		IMPORT_C HBufC8* UnprotectRTCPL(TUint aSSRC, const TDesC8& aPacket);		
+
+       /**
+        * Return the destination address set in NewL
+        * @return aDestination  The destination address, including the port.
+        */		
+		IMPORT_C const TInetAddr& RemoteAddr() ;
+        
+        /**
+        * Set/Update crypto context sharing between streams 
+        * Crypto context ownershíp is transfered.
+        * Note that to update crypto context, the states and the number of packets received
+        * will be reset. ROC will not be re-intialized. This can be used 
+        * only when keys lifetime has not expired.
+        * RFC 4568 6.5, 6.4
+        * @param CSRTPCryptoContext
+        * @leave KErrNone if success, system-wide error code otherwise
+        */
+        IMPORT_C void SetCryptoContextL(CSRTPCryptoContext* aCon);
+        
+        /**
+        * Get cryptographic context associated for this session
+        * @return CSRTPCryptoContext
+        */
+        CSRTPCryptoContext& GetCryptoContext();
+        
+        /**
+        * Add given stream to the list of CSRTPStream objects
+        * @param aStream  The stream to be added to list
+        * @return void
+        */
+        void AddStreamToList(CSRTPStream *aStream);        
+
+        /**
+        * Remove given stream from the list of CSRTPStream objects
+        * @param aStream  The stream to be removed
+        * @return void
+        */
+        void RemoveStreamFromList(CSRTPStream *aStream);   
+ 
+         /**
+        * Call for Rekey 
+        * @param aStream the stream which needs to be rekey
+        * @param aIsStrmCrypto True if stream has it's own crypto, false otherwise
+        * @return void
+        */
+        void ReKeyNeeded(const CSRTPStream& aStream, TBool aIsStrmCrypto);        
+                       
+        
+    private: //methods
+
+        CSRTPSession (const TInetAddr& aDestination,
+                      MSRTPReKeyingObserver& aObs);
+                      
+        CSRTPSession(const TInetAddr& aDestination);
+                                     
+        void ConstructL ( CSRTPCryptoContext* aCon );
+        
+        TBool FindStream(TUint aSSRC, TBool aIsInStream);
+        
+        HBufC8* FindLateBindingStreamAndUnprotectRTPL(TUint aSSRC, 
+												const TDesC8& aPacket);
+		HBufC8* FindLateBindingStreamAndUnprotectRTCPL(TUint aSSRC, 
+												const TDesC8& aPacket);	
+																					
+        void RemoveAllStream( );        
+    
+    private: // from Array
+        /**
+        * iStreamLink, Link to list.
+        */
+        TSglQueLink iStreamLink;
+
+        /**
+        * list of CSRTPStream objects
+        */
+        TSglQue<CSRTPStream> iStreamList;
+
+        /**
+        * CSRTPStream iterator.
+        */
+        TSglQueIter<CSRTPStream> iStreamIter;
+        
+    private: //data
+        /*
+        destination address
+        */
+        const TInetAddr&          iDestination;  
+        /*
+        crypto context, owned
+        */
+        CSRTPCryptoContext* iContext;
+        /*
+        observer (application)
+        */        
+        MSRTPReKeyingObserver* iObserver;
+        
+        TUint8 iStreamCount;
+        
+    protected:
+        /*
+        * Session is created with cryptographic context
+        */
+        TBool   iSesssionCrypto; 
+        /*
+        * True if Rekey is called, False otherwise
+        */
+        TBool 	iRekey;  
+        
+    private:  
+    	friend class CSRTPStream;
+    	#ifdef EUNIT_TESTING
+        friend class UT_CSRTPSession;
+    #endif     
+        
+    };
+
+#endif // __SRTP_SESSION_H__