realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/sipsecdigestcontext.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : sipsecdigestcontext.cpp
       
    15 // Part of       : SIPSec/DigestPlugin
       
    16 // Version       : SIP/6.0
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "sipresponse.h"
       
    22 #include "siprequest.h"
       
    23 #include "sipstrings.h"
       
    24 #include "sipstrconsts.h"
       
    25 #include "sipauthorizationheaderbase.h"
       
    26 #include "sipsecurityverifyheader.h"
       
    27 #include "sipsecdigestcontext.h"
       
    28 #include "sipsecdigestcache.h"
       
    29 #include "sipsecrequestdata.h"
       
    30 #include "CSIPSecDigest.h"
       
    31 #include "CSIPSecCredentials.h"
       
    32 #include "CSIPSecUserRecord.h"
       
    33 #include "SipSecUtils.h"
       
    34 #include "CSIPSecDigestObserver.h"
       
    35 
       
    36 // ============================ MEMBER FUNCTIONS ===============================
       
    37 
       
    38 
       
    39 // -----------------------------------------------------------------------------
       
    40 // TSIPSecDigestContext::TSIPSecDigestContext
       
    41 // -----------------------------------------------------------------------------
       
    42 //
       
    43 TSIPSecDigestContext::TSIPSecDigestContext( CSIPSecCredentials& aCredentials,
       
    44                                             TSIPSecPluginContext* aParent ) :
       
    45     iCredentials( aCredentials ),
       
    46     iParent( aParent )
       
    47     {
       
    48     }
       
    49 
       
    50 // -----------------------------------------------------------------------------
       
    51 // TSIPSecDigestContext::Mechanism
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 CSIPSecDigest& TSIPSecDigestContext::Mechanism() const
       
    55     {
       
    56     return iCredentials.Mechanism();
       
    57     }
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 // TSIPSecDigestContext::Parent
       
    61 // -----------------------------------------------------------------------------
       
    62 //
       
    63 TSIPSecPluginContext& TSIPSecDigestContext::Parent()
       
    64     {
       
    65     __ASSERT_ALWAYS( iParent,
       
    66     	User::Panic( _L( "SIPSecDigestCtx:Parent" ), KErrNotFound ) );
       
    67 
       
    68     return *iParent;
       
    69     }
       
    70 
       
    71 // -----------------------------------------------------------------------------
       
    72 // TSIPSecDigestContext::UserData
       
    73 // -----------------------------------------------------------------------------
       
    74 //
       
    75 CSIPSecUserRecord& TSIPSecDigestContext::UserData()
       
    76 	{
       
    77 	return iCredentials.UserData();
       
    78 	}
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // TSIPSecDigestContext::SetUserData
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 void TSIPSecDigestContext::SetUserData( CSIPSecUserRecord& aUserData )
       
    85 	{
       
    86 	iCredentials.SetUserData( aUserData );
       
    87 	}
       
    88 
       
    89 // -----------------------------------------------------------------------------
       
    90 // TSIPSecDigestContext::GetParam
       
    91 // -----------------------------------------------------------------------------
       
    92 //
       
    93 const TDesC8& TSIPSecDigestContext::GetParam( const CSIPAuthHeaderBase& aHeader,
       
    94 											  TInt aParam )
       
    95     {
       
    96     return aHeader.ParamValue( SIPStrings::StringF( aParam ) ).DesC();
       
    97     }
       
    98 
       
    99 // -----------------------------------------------------------------------------
       
   100 // TSIPSecDigestContext::GetDesParam
       
   101 // -----------------------------------------------------------------------------
       
   102 //
       
   103 const TDesC8&
       
   104 TSIPSecDigestContext::GetDesParam( const CSIPAuthHeaderBase& aHeader,
       
   105 								   TInt aParam )
       
   106     {
       
   107     return aHeader.DesParamValue( SIPStrings::StringF( aParam ) );
       
   108     }
       
   109 
       
   110 // -----------------------------------------------------------------------------
       
   111 // TSIPSecDigestContext::SetParamValueL
       
   112 // -----------------------------------------------------------------------------
       
   113 //
       
   114 void TSIPSecDigestContext::SetParamValueL( CSIPAuthHeaderBase& aHeader,
       
   115 										   TInt aParam,
       
   116 										   const TDesC8& aValue )
       
   117     {
       
   118     if ( aValue.Length() > 0 )
       
   119         {
       
   120 		RStringF value = SIPStrings::Pool().OpenFStringL( aValue );
       
   121 		CleanupClosePushL( value );
       
   122 		aHeader.SetParamL( SIPStrings::StringF( aParam ), value );
       
   123 		CleanupStack::PopAndDestroy(); //value
       
   124         }
       
   125     }
       
   126 
       
   127 // -----------------------------------------------------------------------------
       
   128 // TSIPSecDigestContext::SetDesParamValueL
       
   129 // -----------------------------------------------------------------------------
       
   130 //
       
   131 void TSIPSecDigestContext::SetDesParamValueL( CSIPAuthHeaderBase& aHeader,
       
   132 										   	  TInt aParam,
       
   133 										      const TDesC8& aValue )
       
   134     {
       
   135     if ( aValue.Length() > 0 )
       
   136         {
       
   137 		aHeader.SetDesParamL( SIPStrings::StringF( aParam ), aValue );			
       
   138         }
       
   139     }
       
   140 
       
   141 // -----------------------------------------------------------------------------
       
   142 // TSIPSecDigestContext::SetParamWithEmptyValueL
       
   143 // -----------------------------------------------------------------------------
       
   144 //
       
   145 void TSIPSecDigestContext::SetParamWithEmptyValueL( TInt aParam )
       
   146 	{
       
   147 	iCredentials.Content().SetParamAndAddQuotesL( SIPStrings::StringF( aParam ),
       
   148 												  KNullDesC8 );
       
   149 	}
       
   150 
       
   151 // -----------------------------------------------------------------------------
       
   152 // TSIPSecDigestContext::GetParam
       
   153 // -----------------------------------------------------------------------------
       
   154 //
       
   155 const TDesC8& TSIPSecDigestContext::GetParam( TInt aParam ) const
       
   156     {
       
   157     return GetParam( iCredentials.Content(), aParam );
       
   158     }
       
   159 
       
   160 // -----------------------------------------------------------------------------
       
   161 // TSIPSecDigestContext::GetDesParam
       
   162 // -----------------------------------------------------------------------------
       
   163 //
       
   164 const TDesC8& TSIPSecDigestContext::GetDesParam( TInt aParam ) const
       
   165     {
       
   166     return GetDesParam( iCredentials.Content(), aParam );
       
   167     }
       
   168 
       
   169 // -----------------------------------------------------------------------------
       
   170 // TSIPSecDigestContext::SetParamValueL
       
   171 // -----------------------------------------------------------------------------
       
   172 //
       
   173 void TSIPSecDigestContext::SetParamValueL( TInt aParam, const TDesC8& aValue )
       
   174     {
       
   175     SetParamValueL( iCredentials.Content(), aParam, aValue );
       
   176     }
       
   177 
       
   178 // -----------------------------------------------------------------------------
       
   179 // TSIPSecDigestContext::SetDesParamValueL
       
   180 // -----------------------------------------------------------------------------
       
   181 //
       
   182 void
       
   183 TSIPSecDigestContext::SetDesParamValueL( TInt aParam, const TDesC8& aValue )
       
   184     {
       
   185     SetDesParamValueL( iCredentials.Content(), aParam, aValue );
       
   186     }
       
   187 
       
   188 // -----------------------------------------------------------------------------
       
   189 // TSIPSecDigestContext::Nonce
       
   190 // -----------------------------------------------------------------------------
       
   191 //
       
   192 const TDesC8& TSIPSecDigestContext::Nonce() const
       
   193     {
       
   194     return GetDesParam( SipStrConsts::ENonce );
       
   195     }
       
   196 
       
   197 // -----------------------------------------------------------------------------
       
   198 // TSIPSecDigestContext::NonceCount
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 const TDesC8& TSIPSecDigestContext::NonceCount() const
       
   202 	{
       
   203 	return GetParam( SipStrConsts::ENonceCount );
       
   204 	}
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 // TSIPSecDigestContext::CNonce
       
   208 // -----------------------------------------------------------------------------
       
   209 //
       
   210 const TDesC8& TSIPSecDigestContext::CNonce() const
       
   211 	{
       
   212     return GetDesParam( SipStrConsts::ECNonce );
       
   213 	}
       
   214 
       
   215 // -----------------------------------------------------------------------------
       
   216 // TSIPSecDigestContext::DigestURI
       
   217 // -----------------------------------------------------------------------------
       
   218 //
       
   219 const TDesC8& TSIPSecDigestContext::DigestURI() const
       
   220     {
       
   221     return GetParam( SipStrConsts::EUri );
       
   222     }
       
   223 
       
   224 
       
   225 
       
   226 // ============================ MEMBER FUNCTIONS ===============================
       
   227 	
       
   228 	
       
   229 // ----------------------------------------------------------------------------
       
   230 // TSIPSecDigestCtxSetup::TSIPSecDigestCtxSetup
       
   231 // ----------------------------------------------------------------------------
       
   232 //
       
   233 TSIPSecDigestCtxSetup::TSIPSecDigestCtxSetup(
       
   234 	CSIPSecCredentials& aCredentials,
       
   235 	TTransactionId aTransactionId,
       
   236 	TSIPSecPluginCtxResponse* aParent ) :
       
   237 	TSIPSecDigestContext( aCredentials, aParent ),
       
   238 	iTransactionId( aTransactionId )
       
   239 	{
       
   240 	}
       
   241 	  
       
   242 // -----------------------------------------------------------------------------
       
   243 // TSIPSecDigestCtxSetup::RequestUserCredentialsL
       
   244 // -----------------------------------------------------------------------------
       
   245 //
       
   246 TBool TSIPSecDigestCtxSetup::RequestUserCredentialsL()
       
   247 	{
       
   248     TSIPSecPluginCtxResponse& parent =
       
   249     	static_cast<TSIPSecPluginCtxResponse&>( Parent() );
       
   250     CSIPSecDigestObserver* observer =
       
   251     	parent.Cache().RegisterObserverL( parent.Observer(), UserData() );
       
   252 	return UserData().RequestL( *this, *observer );
       
   253     }
       
   254 
       
   255 // -----------------------------------------------------------------------------
       
   256 // TSIPSecDigestCtxSetup::SetCNonceL
       
   257 // -----------------------------------------------------------------------------
       
   258 //
       
   259 void TSIPSecDigestCtxSetup::SetCNonceL( const TDesC8& aCnonce )
       
   260 	{
       
   261     SetDesParamValueL( SipStrConsts::ECNonce, aCnonce );
       
   262 	}
       
   263 
       
   264 // ----------------------------------------------------------------------------
       
   265 // TSIPSecDigestCtxSetup::TransactionId
       
   266 // ----------------------------------------------------------------------------
       
   267 //
       
   268 TTransactionId TSIPSecDigestCtxSetup::TransactionId() const
       
   269 	{
       
   270 	return iTransactionId;
       
   271 	}
       
   272 
       
   273 
       
   274 // ============================ MEMBER FUNCTIONS ===============================
       
   275 	
       
   276 	
       
   277 // ----------------------------------------------------------------------------
       
   278 // TSIPSecDigestCtxProcess::TSIPSecDigestCtxProcess
       
   279 // ----------------------------------------------------------------------------
       
   280 //
       
   281 TSIPSecDigestCtxProcess::TSIPSecDigestCtxProcess(
       
   282 									CSIPSecCredentials& aCredentials,
       
   283                                     TSIPSecPluginContext* aParent ) :
       
   284     TSIPSecDigestContext( aCredentials, aParent )
       
   285 	{	
       
   286 	}
       
   287 
       
   288 // -----------------------------------------------------------------------------
       
   289 // TSIPSecDigestCtxProcess::Method
       
   290 // -----------------------------------------------------------------------------
       
   291 //
       
   292 const TDesC8& TSIPSecDigestCtxProcess::Method()
       
   293 	{	
       
   294 	return static_cast<TSIPSecPluginCtxRequest&>( Parent() ).
       
   295 		SIPRequest().Method().DesC();
       
   296 	}
       
   297 
       
   298 // -----------------------------------------------------------------------------
       
   299 // TSIPSecDigestCtxProcess::Message
       
   300 // -----------------------------------------------------------------------------
       
   301 //
       
   302 const TDesC8& TSIPSecDigestCtxProcess::Message()
       
   303 	{
       
   304 	return static_cast<TSIPSecPluginCtxRequest&>( Parent() ).
       
   305 		SIPRequest().Content();
       
   306 	}
       
   307 
       
   308 // -----------------------------------------------------------------------------
       
   309 // TSIPSecDigestCtxProcess::SetResponseL
       
   310 // -----------------------------------------------------------------------------
       
   311 //
       
   312 void TSIPSecDigestCtxProcess::SetResponseL( const TDesC8& aResponse )
       
   313 	{
       
   314     SetDesParamValueL( SipStrConsts::EResponse, aResponse );
       
   315 	}
       
   316 
       
   317 // -----------------------------------------------------------------------------
       
   318 // TSIPSecDigestCtxProcess::RequestDataL
       
   319 // -----------------------------------------------------------------------------
       
   320 //
       
   321 CSIPSecRequestData*
       
   322 TSIPSecDigestCtxProcess::RequestDataL( CSIPSecRequestData::TQop aQop )
       
   323     {
       
   324     return CSIPSecRequestData::NewL( *this, aQop );
       
   325     }
       
   326 
       
   327     
       
   328 // ============================ MEMBER FUNCTIONS ===============================
       
   329 
       
   330 
       
   331 // -----------------------------------------------------------------------------
       
   332 // TSIPSecDigestVerifyContext::RequestData
       
   333 // -----------------------------------------------------------------------------
       
   334 //
       
   335 TSIPSecDigestVerifyContext::TSIPSecDigestVerifyContext(
       
   336 	CSIPSecCredentials& aCredentials,
       
   337 	const TDesC8& aUri,
       
   338 	TSIPSecPluginCtxVerify* aParent ) :
       
   339     TSIPSecDigestCtxProcess( aCredentials, aParent ),
       
   340     iUri( aUri )
       
   341     {
       
   342     }
       
   343 
       
   344 // -----------------------------------------------------------------------------
       
   345 // TSIPSecDigestVerifyContext::DigestURI
       
   346 // -----------------------------------------------------------------------------
       
   347 //
       
   348 const TDesC8& TSIPSecDigestVerifyContext::DigestURI() const
       
   349 	{
       
   350     return iUri;
       
   351 	}
       
   352 
       
   353 // -----------------------------------------------------------------------------
       
   354 // TSIPSecDigestVerifyContext::SetResponseL
       
   355 // -----------------------------------------------------------------------------
       
   356 //
       
   357 void TSIPSecDigestVerifyContext::SetResponseL( const TDesC8& aResponse )
       
   358 	{
       
   359     RStringF value = SIPStrings::Pool().OpenFStringL( aResponse );
       
   360     CleanupClosePushL( value );
       
   361     static_cast< TSIPSecPluginCtxVerify& >( Parent() ).
       
   362     	SecurityVerifyHeader().SetParamL( SIPStrings::StringF(
       
   363     		SipStrConsts::EDigestVerify ), value );
       
   364     CleanupStack::PopAndDestroy(); // value
       
   365 	}
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 // TSIPSecDigestVerifyContext::RequestDataL
       
   369 // -----------------------------------------------------------------------------
       
   370 //
       
   371 CSIPSecRequestData*
       
   372 TSIPSecDigestVerifyContext::RequestDataL( CSIPSecRequestData::TQop aQop )
       
   373     {
       
   374     return CSIPSecDigestVerifyData::NewL( *this, aQop );
       
   375     }
       
   376 
       
   377 
       
   378 
       
   379 // ----------------------------------------------------------------------------
       
   380 // TSIPSecDigestVerifyContext::SecurityServerHeaderL
       
   381 // Example
       
   382 // 	Security-Server: ipsec-ike;q=0.1
       
   383 // 	Security-Server: tls;q=0.2
       
   384 // Result
       
   385 // 	Security-Server:ipsec-ike;q=0.1,tls;q=0.2
       
   386 // ----------------------------------------------------------------------------
       
   387 //	
       
   388 HBufC8* TSIPSecDigestVerifyContext::SecurityServerHeaderL()
       
   389     {
       
   390     HBufC8* serverHeader( NULL );
       
   391 
       
   392     TSglQueIter<CSIPHeaderBase> headers(
       
   393     	static_cast< TSIPSecPluginCtxVerify& >( Parent() ).
       
   394     		SecurityServerHeaders() );
       
   395 
       
   396     if ( headers )
       
   397         {
       
   398         CBufBase* encoded = SipSecUtils::EncodeHeadersL( headers );
       
   399         CleanupStack::PushL( encoded );
       
   400         TPtr8 encodedPtr( encoded->Ptr( 0 ) );
       
   401         serverHeader = encodedPtr.AllocL();
       
   402         CleanupStack::PopAndDestroy( encoded );
       
   403         }
       
   404         
       
   405     return serverHeader;    
       
   406     }
       
   407 
       
   408 
       
   409 // ============================ MEMBER FUNCTIONS ===============================
       
   410 
       
   411 
       
   412 // -----------------------------------------------------------------------------
       
   413 // TSIPSecDigestAuthInfoContext::TSIPSecDigestAuthInfoContext
       
   414 // -----------------------------------------------------------------------------
       
   415 //
       
   416 TSIPSecDigestAuthInfoContext::TSIPSecDigestAuthInfoContext(
       
   417 										CSIPSecCredentials& aCredentials,
       
   418                       	                TDes8& aResponse,
       
   419                       	                TSIPSecPluginCtxResponse* aParent ) :
       
   420     TSIPSecDigestCtxProcess( aCredentials, aParent ),
       
   421     iResponse( aResponse )
       
   422     {    
       
   423     }
       
   424 
       
   425 // -----------------------------------------------------------------------------
       
   426 // TSIPSecDigestAuthInfoContext::SetResponseL
       
   427 // -----------------------------------------------------------------------------
       
   428 //
       
   429 void TSIPSecDigestAuthInfoContext::SetResponseL( const TDesC8& aResponse )
       
   430     {
       
   431 	__ASSERT_ALWAYS( iResponse.MaxLength() >= aResponse.Length(),
       
   432 	 				 User::Leave( KErrArgument ) );
       
   433     iResponse.Copy( aResponse );
       
   434     }
       
   435 
       
   436 // -----------------------------------------------------------------------------
       
   437 // TSIPSecDigestAuthInfoContext::Method
       
   438 // -----------------------------------------------------------------------------
       
   439 //
       
   440 const TDesC8& TSIPSecDigestAuthInfoContext::Method()
       
   441     {
       
   442     return KNullDesC8;
       
   443     }
       
   444 
       
   445 // -----------------------------------------------------------------------------
       
   446 // TSIPSecDigestAuthInfoContext::Message
       
   447 // -----------------------------------------------------------------------------
       
   448 //
       
   449 const TDesC8& TSIPSecDigestAuthInfoContext::Message()
       
   450     {
       
   451 	return static_cast< TSIPSecPluginCtxResponse& >( Parent() ).
       
   452 		SIPResponse().Content();
       
   453     }
       
   454 
       
   455 // End of File