--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmccinterface/src/mmccsecureinterface.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2006 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: Class is used for configuring secure RTP.
+*
+*/
+
+
+
+
+#include "mmccsecureinterface.h"
+#include "mmccinterfacelogs.h"
+#include "mccdef.h"
+#include "mccinternaldef.h"
+#include "mmcccryptocontextcontainer.h"
+#include "mmcccryptocontext.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CMccEvent::CMccEvent
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMccSecureInterface::CMccSecureInterface( CMccInterface& aInterface )
+ : iInterface( aInterface ), iMessageDest( KMccControllerUidInterface )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMccInterface::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMccSecureInterface::ConstructL( )
+ {
+ __INTERFACE( "CMccSecureInterface::ConstructL" )
+ iInterface.GetController( iController );
+
+ iContextContainer = CMccCryptoContextContainer::NewL();
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::NewL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CMccSecureInterface* CMccSecureInterface::NewL( CMccInterface& aInterface )
+ {
+ CMccSecureInterface* self = new(ELeave) CMccSecureInterface( aInterface );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::~CMccSecureInterface
+// ---------------------------------------------------------------------------
+//
+CMccSecureInterface::~CMccSecureInterface()
+ {
+ delete iContextContainer;
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::CreateContext
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMccSecureInterface::CreateContext( const TDesC8& aMasterKey,
+ const TDesC8& aSaltKey,
+ TUint32& aContextId,
+ const TDesC8& aParams )
+ {
+ __INTERFACE( "MccSecureInterface::CreateContext" )
+
+ TInt err = KErrNone;
+
+ TMccSrtpMasterKeyPckg masterKeyPckg =
+ static_cast<const TMccSrtpMasterKeyPckg&>( aMasterKey );
+ TMccSrtpMasterSaltPckg masterSaltPckg =
+ static_cast<const TMccSrtpMasterSaltPckg&>( aSaltKey );
+ TMccSrtpCryptoParamsPckg cryptoParamsPckg =
+ static_cast<const TMccSrtpCryptoParamsPckg&>( aParams );
+
+ err = iContextContainer->CreateContext( masterKeyPckg(),
+ masterSaltPckg(),
+ aContextId,
+ cryptoParamsPckg() );
+
+ __INTERFACE_INT1( "MccSecureInterface::CreateContext, exit with ", err )
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::UpdateContext
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMccSecureInterface::UpdateContext( const TDesC8& aMasterKey,
+ const TDesC8& aSaltKey,
+ TUint32 aContextId,
+ const TDesC8& aParams )
+ {
+ __INTERFACE( "MccSecureInterface::UpdateContext" )
+
+ TInt err( KErrNone );
+
+ TMccCryptoContext* contextToUpdate;
+
+ err = iContextContainer->GetContext( aContextId, contextToUpdate );
+
+ if ( KErrNone != err )
+ {
+ return err;
+ }
+
+ TMccSrtpMasterKeyPckg masterKeyPckg =
+ static_cast<const TMccSrtpMasterKeyPckg&>( aMasterKey );
+ TMccSrtpMasterSaltPckg masterSaltPckg =
+ static_cast<const TMccSrtpMasterSaltPckg&>( aSaltKey );
+ TMccSrtpCryptoParamsPckg cryptoParamsPckg =
+ static_cast<const TMccSrtpCryptoParamsPckg&>( aParams );
+
+ TMccCryptoContext cryptoContextCandidate( 0,
+ masterKeyPckg(),
+ masterSaltPckg(),
+ cryptoParamsPckg() );
+
+ // Validate candidates params
+ err = cryptoContextCandidate.ValidateContext();
+
+ if ( KErrNone != err )
+ {
+ return err;
+ }
+
+ // Get crypto context binding destination
+ // if returns KErrNotFound context isn't binded yet
+ TMccSecurityDestination securityDest;
+
+ err = contextToUpdate->GetDestinationInfo( securityDest.iSessionID, securityDest.iLinkID,
+ securityDest.iStreamID, securityDest.iEndpointID );
+
+ if ( KErrNotFound != err )
+ {
+ cryptoContextCandidate.SetDestinationInfo( securityDest.iSessionID,
+ securityDest.iLinkID,
+ securityDest.iStreamID,
+ securityDest.iEndpointID );
+
+ TMccCryptoContextPckg cryptoContextPckg( cryptoContextCandidate );
+
+ TMccSecurityDestinationBuffer securityDestPckg( securityDest );
+
+ err = iController.CustomCommandSync( iMessageDest,
+ EMccBindContextIntoStream,
+ cryptoContextPckg,
+ securityDestPckg );
+ if ( KErrNone != err )
+ {
+ return err;
+ }
+ }
+
+ err = iContextContainer->UpdateContext( aContextId, cryptoContextCandidate );
+
+ __INTERFACE_INT1( "MccSecureInterface::UpdateContext, exit with ", err )
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::RemoveContext
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMccSecureInterface::RemoveContext( TUint32 aContextId )
+ {
+ __INTERFACE( "MccSecureInterface::RemoveContext" )
+
+ TInt err( KErrNone );
+
+
+ TMccCryptoContext* contextToRemove;
+ err = iContextContainer->GetContext( aContextId, contextToRemove );
+
+ if ( KErrNotFound == err )
+ {
+ return err;
+ }
+
+ // Get crypto context binding destination
+ // if returns KErrNotFound context isn't binded yet
+ TMccSecurityDestination securityDest;
+
+ err = contextToRemove->GetDestinationInfo( securityDest.iSessionID, securityDest.iLinkID,
+ securityDest.iStreamID, securityDest.iEndpointID );
+
+ if ( KErrNotFound != err )
+ {
+ TMccSecurityDestinationBuffer securityDestPckg( securityDest );
+
+ err = iController.CustomCommandSync( iMessageDest,
+ EMccRemoveContext,
+ KNullDesC8,
+ securityDestPckg );
+ }
+
+
+
+ err = iContextContainer->RemoveContext( aContextId );
+
+ __INTERFACE_INT1( "MccSecureInterface::RemoveContext, exit with ", err )
+
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// CMccSecureInterface::Bind
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMccSecureInterface::Bind( TUint32 aSessionId, TUint32 aLinkId,
+ TUint32 aStreamId, TUint32 aEndPointId,
+ TUint32 aContextId )
+ {
+ __INTERFACE( "MccSecureInterface::Bind IN" )
+
+ TInt err = KErrNone;
+
+ TMccCryptoContext* context;
+
+ err = iContextContainer->GetContext( aContextId, context );
+
+ if ( KErrNotFound == err )
+ {
+ return err;
+ }
+
+ TMccSecurityDestination securityDest;
+
+ err = context->GetDestinationInfo( securityDest.iSessionID, securityDest.iLinkID,
+ securityDest.iStreamID, securityDest.iEndpointID );
+
+ // Checks if crypto context is already binded to destination. Can't bind twice
+ if ( KErrNotFound != err )
+ {
+ return KErrArgument;
+ }
+
+ TMccCryptoContextPckg cryptoContextPckg( *context );
+
+ securityDest.iSessionID = aSessionId;
+ securityDest.iLinkID = aLinkId;
+ securityDest.iStreamID = aStreamId;
+ securityDest.iEndpointID = aEndPointId;
+
+ TMccSecurityDestinationBuffer securityDestPckg( securityDest );
+
+ err = iController.CustomCommandSync( iMessageDest,
+ EMccBindContextIntoStream,
+ cryptoContextPckg,
+ securityDestPckg
+ );
+
+ __INTERFACE_INT1( "MccSecureInterface::Bind, exit with ", err )
+
+ if ( KErrNone == err )
+ {
+ context->SetDestinationInfo( aSessionId, aLinkId, aStreamId, aEndPointId );
+ }
+ return err;
+ }