diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmccinterface/src/mmccsecureinterface.cpp --- /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( aMasterKey ); + TMccSrtpMasterSaltPckg masterSaltPckg = + static_cast( aSaltKey ); + TMccSrtpCryptoParamsPckg cryptoParamsPckg = + static_cast( 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( aMasterKey ); + TMccSrtpMasterSaltPckg masterSaltPckg = + static_cast( aSaltKey ); + TMccSrtpCryptoParamsPckg cryptoParamsPckg = + static_cast( 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; + }