rtp/srtpstack/src/srtpcryptocontext.cpp
changeset 0 307788aac0a8
--- /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 <e32std.h>
+#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;
+    }
+