Exemplo n.º 1
0
DMAD_EXPORT_C void CDmAdEngine::ExecuteCommandL(const TDesC8& aUri,
                                                const TDesC8& aLuid,
                                                const TDesC8& aArgument,
                                                const TDesC8& aType,
                                                TInt aStatusRef)
    {
    TRACE("CDmAdEngine::ExecuteCommandL");
    
    DEBUG_LOG1(_L8("aUri %S"), &aUri);
    DEBUG_LOG1(_L8("aLuid %S"), &aLuid);
    
    DEBUG_LOG(_L("Argument:"));
    DEBUG_LOG_HEX(aArgument);
    
    DEBUG_LOG1(_L8("aType %S"), &aType);
    DEBUG_LOG1(_L("aStatusRef = %d"), aStatusRef);
        
    if (!iDdfApi->IsLeafUnderRtNodeL(aUri))
        {
        iDdfApi->NotRtNodeUpdateLeafObjectL(aUri, aLuid, aArgument, aType, aStatusRef);
        }
    else
        {
        iCallBack->SetStatusL(aStatusRef, KErrNotFound);
        }
    }
Exemplo n.º 2
0
DMAD_EXPORT_C void CDmAdEngine::DeleteObjectL(const TDesC8& aUri, const TDesC8& aLuid, TInt aStatusRef)
    {
    TRACE("CDmAdEngine::DeleteObjectL");
    DEBUG_LOG1(_L8("aUri %S"), &aUri);
    DEBUG_LOG1(_L8("aLuid %S"), &aLuid);
    DEBUG_LOG1(_L("aStatusRef = %d"), aStatusRef);
        
    TPtrC8 uri(TDmAdUtil::RemoveDotSlash(aUri));
    TRAPD(err, DoDeleteObjectL(uri, aLuid, aStatusRef));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        }
    }
Exemplo n.º 3
0
void CIkeV2PkiService::SignalObserverL(TInt aStatus)
{    
    DEBUG_LOG1(_L("CIkeV2PkiService::SignalObserverL: Signalling with %d"), aStatus);
    
    if (aStatus != KErrNone)
        {
        delete iUserCertificate;
        iUserCertificate = NULL;
        
		delete iCaName;
		iCaName = NULL;
				
		iCertPtr.Zero();
        
        iTrustedCAList->ResetAndDestroy(); // Trusted CA certificate list 
               
        }

    iIkeData = NULL;

    iSubjName->Des().Zero();
    iRfc822Name->Des().Zero();

    iCertKeyId.Zero();
    iResArray = NULL;
    
    iCasTrustedByPeer.Reset();
    	    	    	    
    delete iIkeDataCAList;
    iIkeDataCAList = NULL;
    	    	       
    iState = EPkiServiceIdle;
    iObserver.IkeV2PkiInitCompleteL(aStatus);		
}
Exemplo n.º 4
0
void CIkev1SA::CancelRekey()
    {
    if ( iLeftOverTime != 0 )
        {
        DEBUG_LOG1(_L("CIkev1SA::CancelRekey, remaining time=%d"), iLeftOverTime );
        iRemainingTime = iLeftOverTime;
        iLeftOverTime = 0;
        }        
    }
Exemplo n.º 5
0
DMAD_EXPORT_C void CDmAdEngine::ChildURIListL(const TDesC8& aUri, const TDesC8& aParentLuid, 
                                              const CArrayFix<TSmlDmMappingInfo>& aPreviousUriSegmentList, 
                                              TInt aResultsRef, TInt aStatusRef)
    {
    TRACE("CDmAdEngine::ChildURIListL");

    DEBUG_LOG1(_L8("aUri %S"), &aUri);
    DEBUG_LOG1(_L8("aParentLuid %S"), &aParentLuid);
    DEBUG_LOG2(_L("aResultsRef = %d, aStatusRef = %d"), aResultsRef, aStatusRef);
    
    
    TPtrC8 uri(TDmAdUtil::RemoveDotSlash(aUri));
    TRAPD(err, DoChildUriListL(uri, aParentLuid, aPreviousUriSegmentList, aResultsRef, aStatusRef));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        }
    }
Exemplo n.º 6
0
Arquivo: screen.c Projeto: rasilon/vim
static void damagerect(VTermScreen *screen, VTermRect rect)
{
  VTermRect emit;

  switch(screen->damage_merge) {
  case VTERM_DAMAGE_CELL:
    /* Always emit damage event */
    emit = rect;
    break;

  case VTERM_DAMAGE_ROW:
    /* Emit damage longer than one row. Try to merge with existing damage in
     * the same row */
    if(rect.end_row > rect.start_row + 1) {
      /* Bigger than 1 line - flush existing, emit this */
      vterm_screen_flush_damage(screen);
      emit = rect;
    }
    else if(screen->damaged.start_row == -1) {
      /* None stored yet */
      screen->damaged = rect;
      return;
    }
    else if(rect.start_row == screen->damaged.start_row) {
      /* Merge with the stored line */
      if(screen->damaged.start_col > rect.start_col)
        screen->damaged.start_col = rect.start_col;
      if(screen->damaged.end_col < rect.end_col)
        screen->damaged.end_col = rect.end_col;
      return;
    }
    else {
      /* Emit the currently stored line, store a new one */
      emit = screen->damaged;
      screen->damaged = rect;
    }
    break;

  case VTERM_DAMAGE_SCREEN:
  case VTERM_DAMAGE_SCROLL:
    /* Never emit damage event */
    if(screen->damaged.start_row == -1)
      screen->damaged = rect;
    else {
      rect_expand(&screen->damaged, &rect);
    }
    return;

  default:
    DEBUG_LOG1("TODO: Maybe merge damage for level %d\n", screen->damage_merge);
    return;
  }

  if(screen->callbacks && screen->callbacks->damage)
    (*screen->callbacks->damage)(emit, screen->cbdata);
}
Exemplo n.º 7
0
DMAD_EXPORT_C void CDmAdEngine::UpdateLeafObjectL(const TDesC8& aUri, const TDesC8& aLuid, 
                                                  const TDesC8& aObject, const TDesC8& aType, 
                                                  TInt aStatusRef)
    {
    TRACE("CDmAdEngine::UpdateLeafObjectL");

    DEBUG_LOG1(_L8("aUri %S"), &aUri);
    DEBUG_LOG1(_L8("aLuid %S"), &aLuid);
    DEBUG_LOG1(_L8("aType %S"), &aType);
    DEBUG_LOG1(_L("aStatusRef = %d"), aStatusRef);

    
    DEBUG_LOG(_L("Object:"));    
    DEBUG_LOG_HEX(aObject);
    
    TPtrC8 uri(TDmAdUtil::RemoveDotSlash(aUri));
    TRAPD(err, DoUpdateLeafObjectL(uri, aLuid, aObject, aType, aStatusRef));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        }
    }
Exemplo n.º 8
0
DMAD_EXPORT_C void CDmAdEngine::FetchLeafObjectSizeL(const TDesC8& aUri,
                                                     const TDesC8& aLuid,
                                                     const TDesC8& aType,
                                                     TInt aResultsRef,
                                                     TInt aStatusRef)
    {
    TRACE("CDmAdEngine::FetchLeafObjectSizeL");
        
    DEBUG_LOG1(_L8("aUri %S"), &aUri);
    DEBUG_LOG1(_L8("aLuid %S"), &aLuid);
    DEBUG_LOG1(_L8("aType %S"), &aType);
    DEBUG_LOG2(_L("aResultsRef = %d, aStatusRef = %d"), aResultsRef, aStatusRef);
    
    TPtrC8 uri(TDmAdUtil::RemoveDotSlash(aUri));
    TInt status = KErrNone;
    CBufBase* object = 0;
    TRAPD(err, status = DoFetchLeafObjectL(uri, aLuid, aType, object));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        return;
        }
    if (status != KErrNone)
        {
        delete object;
        iCallBack->SetStatusL(aStatusRef, status);
        return;
        }
    
    CleanupStack::PushL(object);
    TInt objSizeInBytes = object->Size();
    HBufC8* sizeBuf = TDmAdUtil::IntToDes8LC(objSizeInBytes);
    object->Reset();
    object->InsertL(0, *sizeBuf);
        
    iCallBack->SetResultsL(aResultsRef, *object, aType);
    iCallBack->SetStatusL(aStatusRef, status);
    CleanupStack::PopAndDestroy(2); //sizeBuf, object
    }
Exemplo n.º 9
0
void CIkeV2PkiService::RunL()
    {   
    DEBUG_LOG1(_L("CIkeV2PkiService::RunL: Status %d"), iStatus.Int());
    
	//
	// A PKI service operation completed. Take actions according to
	// iOperation code
	//

    TInt err = KErrNone;
			
	TInt status = iStatus.Int();				

    iPkiService.Finalize(iResArray);
    iResArray = NULL;

	
	switch ( iState )
	    {
		case EBuildingCaList:
            TRAP(err, BuildingCaListRunL());
            break;				
		case EReadingCertificate:
		    TRAP(err, ReadUserCertificateRunL());
			break;
		case EReadingCertificateChain:
		    TRAP(err, ReadCertificateChainRunL());
		    break;
		default:
		    DEBUG_LOG(_L("RunL called in unknown state"));
		    User::Invariant();
			break;
	    }	

	if ( err != KErrNone )
	    {	
	    DEBUG_LOG(_L("Operation completed. Signalling observer."));

        SignalObserverL(err);
	    }   
    }
Exemplo n.º 10
0
//
// Flush all Ipsec SA:s bound to this IKE SA from SADB and send Delete
// payload for all inbound SAs
// 
void CIkev1SA::DeleteIpsecSAs()
{
    TIpsecSPI* spi_node;
	TInt c = iSPIList->Count();
    for (TInt i = 0; i < c; i++)
    {
        spi_node = iSPIList->At(i);
        if ( spi_node->iInbound )
		{	
            //Only the inbound ones notified to avoid receiving packets using an expired SA
            //The opposite if receiving a Delete
			DEBUG_LOG1(_L("Sending ISAKMP Delete payload for IPSec SPI %x"),
			        (int)ByteOrder::Swap32(spi_node->iSPI));

            // Call to delete may fail (delete sends DELETE payloads, and the data connection 
            // may not be open anymore). This is non-fatal, however.
            TRAPD(err, iPluginSession.DeleteIpsecSAL(&iHdr, spi_node));
            if (err == KErrNone) 
                {
                // DELETE sent successfully
    			DEBUG_LOG(_L("CIkev1SA::DeleteIpsecSAsL() IPsec SA delete OK"));
                }
            else if (err == KErrNotFound) 
                {
                // Non-fatal leave occured (couldn't send DELETE due to invalid connection)
                // We can still continue purging IPSEC SAs.
    			DEBUG_LOG(_L("CIkev1SA::DeleteIpsecSAsL() IPsec SA delete failed due non-existing connection. Non-fatal, continuing"));
                }
            else
                {
                // Fatal leave (e.g. out of memory etc)
    			DEBUG_LOG(_L("CIkev1SA::DeleteIpsecSAsL() IPsec SA deletion error. Fatal."));
    			iPluginSession.HandleError(err);
                return;
                }
		}
	    iPluginSession.DeleteIpsecSA(spi_node->iSPI, spi_node->iSrcAddr, spi_node->iDstAddr, spi_node->iProtocol);		
		delete spi_node;
    }
    iSPIList->Reset();  //Empties the full list at once
}
Exemplo n.º 11
0
DMAD_EXPORT_C void CDmAdEngine::CopyCommandL(const TDesC8& aTargetUri,
                                             const TDesC8& aTargetLuid,
                                             const TDesC8& aSourceUri,
                                             const TDesC8& aSourceLuid,
                                             const TDesC8& aType,
                                             TInt aStatusRef)
    {
    TRACE("CDmAdEngine::CopyCommandL");
    
    DEBUG_LOG1(_L8("aTargetUri = %S"), &aTargetUri);
    DEBUG_LOG1(_L8("aTargetLuid = %S"), &aTargetLuid);
    DEBUG_LOG1(_L8("aSourceUri = %S"), &aSourceUri);
    DEBUG_LOG1(_L8("aSourceLuid = %S"), &aSourceLuid);
    DEBUG_LOG1(_L8("aType = %S"), &aType);
    DEBUG_LOG1(_L("aStatusRef = %d"), aStatusRef);
    

    TInt err = KErrNone;
    TPtrC8 sourceUri(TDmAdUtil::RemoveDotSlash(aSourceUri));
    TInt status = KErrNone;
    CBufBase* object = 0;
    TRAP(err, status = DoFetchLeafObjectL(sourceUri, aSourceLuid, aType, object));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        return;
        }
    if (status != KErrNone)
        {
        delete object;
        iCallBack->SetStatusL(aStatusRef, status);
        return;
        }
    
    CleanupStack::PushL(object);

    DEBUG_LOG(_L("object:"));
    DEBUG_LOG_HEX(object->Ptr(0));
    
    TPtrC8 targetUri(TDmAdUtil::RemoveDotSlash(aTargetUri));
    TRAP(err, DoUpdateLeafObjectL(targetUri, aTargetLuid, object->Ptr(0), aType, aStatusRef));
    if (err != KErrNone)
        {
        iCallBack->SetStatusL(aStatusRef, err);
        }

    CleanupStack::PopAndDestroy(); // object
    }
Exemplo n.º 12
0
DMAD_EXPORT_C void TDmAdUtil::ParseUriLC(const TDesC8& aUri, CArrayFix<TPtrC8>*& aUriSegList)
    {
    TPtrC8 uri(TDmAdUtil::RemoveDotSlash(aUri));
    
    CArrayFix<TPtrC8>* uriSegList;
    uriSegList = new (ELeave) CArrayFixFlat<TPtrC8>(8);
    CleanupStack::PushL(uriSegList);

    TPtrC8 seg;
    TPtrC8 curr(uri);

    while (curr.Length() > 0)
        {
        TInt offset = curr.Locate('/');
        if (offset == KErrNotFound)
            {
            seg.Set(curr);
            curr.Set(KNullDesC8);
            }
        else
            {
            seg.Set(curr.Left(offset));
            TInt rightLth = curr.Length() - offset - 1;
            if (rightLth <= 0)           
                {
                DEBUG_LOG(_L("TDmAdUtil::ParseUriLC: corrupted uri"));
                DEBUG_LOG1(_L8("URI: %S"), &aUri);
                
                User::Leave(KErrGeneral);
                }
            curr.Set(curr.Right(rightLth));
            }
        uriSegList->AppendL(seg);
        }
    
    aUriSegList = uriSegList;
    }
Exemplo n.º 13
0
DMAD_EXPORT_C void TDmAdUtil::BuildRtNodeChildUriListL(MDmAdCallBack*                          aDmAdCallBack,
                                                  MDmAdStoreApi*                          aStoreApi,
                                                  const TDesC8&                           aUri,
                                                  const TDesC8&                           aParentLuid,
                                                  const CArrayFix<TSmlDmMappingInfo>&     aPreviousUriSegmentList,
                                                  CBufBase&                               aCurrentList)
    {
#ifdef DMAD_DUMP_PREVIOUS_URI_SEGMENT_LIST
        DEBUG_LOG(_L("BuildRtNodeChildUriListL:"));
        {
        for (TInt i=0; i < aPreviousUriSegmentList.Count(); i++)
            {
            const TSmlDmMappingInfo& mappingInfo = aPreviousUriSegmentList.At(i);
                        
            DEBUG_LOG1(_L("entry %d:"), i);            
            DEBUG_LOG1(_L8("Uri: %S"), &(mappingInfo.iURISeg));
            DEBUG_LOG_HEX(mappingInfo.iURISegLUID);
            
            }
        }
#endif

    RPointerArray<HBufC8> luidList;
    CleanupStack::PushL(TCleanupItem(PointerArrayCleanup, &luidList));
    
    aStoreApi->LuidListL(aUri, aParentLuid, luidList);


    // Finds largest number used in cli<x> named nodes.
    TInt largest = FindLargestLocallyCreated(aPreviousUriSegmentList);
    DEBUG_LOG1(_L("largest is cli%d"), largest);
    
    TInt countLuidList = luidList.Count();
    for (TInt j=0; j < countLuidList; j++)
        {
        const HBufC8* luidElem = luidList[j];

        HBufC8* uriSeg = 0;
        
        //Tries to find the luid from the aPreviousUriSegmentList
        for (TInt i=0; i < aPreviousUriSegmentList.Count(); i++)
            {
            const TSmlDmMappingInfo& mappingInfo = aPreviousUriSegmentList.At(i);
                        
            if (mappingInfo.iURISegLUID.Compare(*luidElem) == 0)
                {            
                uriSeg = mappingInfo.iURISeg.AllocLC();
                break;
                }
            }
        
        if (uriSeg == 0)
            {
            //Uri was not found from the aPreviousUriSegmentList
            uriSeg = BuildLocallyCreatedRtNodeUriSegLC(largest);
            
            DEBUG_LOG2(_L8("uriSeg %S, largest %d"), uriSeg, largest);
            
            HBufC8* wholeUri = TDmAdUtil::BuildUriLC(aUri, *uriSeg);            
            aDmAdCallBack->SetMappingL(*wholeUri, *luidElem);
            CleanupStack::PopAndDestroy(); //wholeUri
            }

        //If this is not the first element, inserts slash at the beginning
        //of the result list.
        if (j > 0)
            {            
            aCurrentList.InsertL(aCurrentList.Size(), KDmAdSeparator);
            }
        aCurrentList.InsertL(aCurrentList.Size(), *uriSeg);
        
        CleanupStack::PopAndDestroy(); // uriSeg
        }
    
    CleanupStack::PopAndDestroy(); //luidList
    }
Exemplo n.º 14
0
EXPORT_C TInt CIkeV2PkiService::Ikev2SignatureL(const TDesC8& aTrustedAuthority, 
                                                const TOwnCertInfo& aOwnCertInfo, 
                                                const TDesC8& aMsgOctets, 
                                                TDes8& aSignature, TUint8 aAuthMeth)
    {
    __ASSERT_ALWAYS(!IsActive(), User::Invariant());	

	TPKIKeyAlgorithm keyAlgorithm = EPKIRSA;	
    TInt length = aOwnCertInfo.iSubjectDnSuffix.Length();
    if ( length )
        {
        delete iSubjName;
        iSubjName = NULL;
        iSubjName = HBufC8::NewL(length);  	   			 
        iSubjName->Des().Copy(aOwnCertInfo.iSubjectDnSuffix);		
        }
    else 
        {
        iSubjName->Des().Zero();
        } 

    length = aOwnCertInfo.iRfc822NameFqdn.Length();
    if ( length )
        {
        delete iRfc822Name;
        iRfc822Name = NULL;
        iRfc822Name = HBufC8::NewL(length);  	   			 
        iRfc822Name->Des().Copy(aOwnCertInfo.iRfc822NameFqdn);        	 
        }
    else
        {
        iRfc822Name->Des().Zero();
        }

	//
	// Build PKCS1v15 format signature (ASN1 encoded) for RSA and SHA1 for DSA
	//
	CUtlMessageDigest* digest = TUtlCrypto::MakeMessageDigesterL(TUtlCrypto::EUtlMessageDigestSha1);
	CleanupStack::PushL(digest);
	HBufC8* asn1EncodedHash =NULL;
	HBufC8* DSSHash = NULL;
			
	switch( aAuthMeth )
		{
			case RSA_DIGITAL_SIGN:
				asn1EncodedHash = IkeCert::BuildPkcs1v15HashL(digest->Final(aMsgOctets));
				User::LeaveIfNull(asn1EncodedHash);
	    		CleanupStack::PopAndDestroy(digest);
    			CleanupStack::PushL(asn1EncodedHash);
    			User::LeaveIfError(iPkiService.Sign(aTrustedAuthority, *iSubjName, *iRfc822Name, 
		                                    		EX509DigitalSignature, aOwnCertInfo.iPrivateKeyLength, 
	                                    			keyAlgorithm, *asn1EncodedHash, aSignature));
   				CleanupStack::PopAndDestroy(asn1EncodedHash);
   				DEBUG_LOG(_L("Signing Auth data using RSA key."));
   				break;
			case DSS_DIGITAL_SIGN:
				DSSHash = HBufC8::New(20);
				DSSHash->Des().Append(digest->Final(aMsgOctets));
				CleanupStack::PopAndDestroy(digest);
    			CleanupStack::PushL(DSSHash);
				User::LeaveIfError(iPkiService.Sign(aTrustedAuthority, *iSubjName, *iRfc822Name, 
		                                    EX509DigitalSignature, aOwnCertInfo.iPrivateKeyLength, 
	                                    	keyAlgorithm, *DSSHash, aSignature));
   				CleanupStack::PopAndDestroy(DSSHash);
   				DEBUG_LOG(_L("Signing Auth data using DSA key."));
   				break;
   			default:
   				DEBUG_LOG1(_L("Authentication method %d not supported when using digital signatures."), aAuthMeth);
   				User::Leave(KErrNotSupported);
   				break;			
		}

	return aSignature.Length();
    }	 
Exemplo n.º 15
0
void CIkev1SA::ConstructL(TIkev1SAData& aIkev1SAdata, CSARekeyInfo* aSaRekey)
{
	CTimer::ConstructL();   			
	iHdr.CopyL(aIkev1SAdata);
	
	if ( aSaRekey )
	{
	   //
	   // Rekeyed IKE SA. Try to find "original" IKE SA and move IPSEC
	   // SPI list from that SA to the new rekeyed one.
	   // If "original" IKE SA is found, (re)start expiration timer
	   // with rekey "left over" time.
	   //
	   iRekeyed = ETrue;
	   CIkev1SA *OrigSA = iPluginSession.FindIkev1SA(aSaRekey->GetCookieI(), aSaRekey->GetCookieR());
	   if ( OrigSA )
	   {
		  DEBUG_LOG(_L("ISAKMP SA Rekeyed, SPI list moved from original SA"));		   
		  iSPIList = OrigSA->iSPIList;
		  OrigSA->iSPIList = NULL;
		  OrigSA->iSPIList = new (ELeave) CIpsecSPIList(1);  // Dummy
		  if ( OrigSA->IsActive() )
		  {
			 OrigSA->Cancel();  		  
			 OrigSA->iRemainingTime = 0;
			 OrigSA->iLeftOverTime = 0;
			 DEBUG_LOG1(_L("Rekeyed SA expiration time set to %u"),OrigSA->iRemainingTime);
		     OrigSA->StartTimer();
		  }	 
	   }
	}
	
	if ( !iSPIList ) 
       iSPIList = new (ELeave) CIpsecSPIList(4);

	TInt DPDHeartbeat;

	if ( iHdr.iDPDSupported && iHdr.iIkeData->iDPDHeartBeat )
	     DPDHeartbeat = iHdr.iIkeData->iDPDHeartBeat;      
	else DPDHeartbeat = 0;

	TInt KeepAliveTimeout = 0;
	TInt port = IkeSocket::KIkePort500;
	TUint32 NATKeepAlive = (iHdr.iNAT_D_Flags & LOCAL_END_NAT);
	if ( NATKeepAlive || iHdr.iNAT_T_Required )
	{
		KeepAliveTimeout = (TInt)iHdr.iIkeData->iNatKeepAlive; 
		if ( NATKeepAlive )
		{	   
		    port = IkeSocket::KIkePort4500;
			if ( KeepAliveTimeout == 0 )
				KeepAliveTimeout = 120;  // If not configured use 2 minutes  
		}	  
	}

	if ( DPDHeartbeat || KeepAliveTimeout )
	{
		iIkeKeepAlive = CIkeV1KeepAlive::NewL( iPluginSession,
		                                       port,
		                                       (TInetAddr&)iHdr.iDestinAddr,
		                                       KeepAliveTimeout,
		                                       DPDHeartbeat,
										       (MDpdHeartBeatEventHandler*)this );
	}
	
	// Nokia NAT-T needed
	if (!NATKeepAlive &&
	    iHdr.iNAT_T_Required &&
	    (KeepAliveTimeout > 0) )
		{
		// Start Nokia IPsec over NAT keepalive handler
		TInetAddr addr = (TInetAddr)iHdr.iDestinAddr;
		
		// NAT-T default ESP UDP port
		TInt port(KNokiaNattDefaultPort);
		if (iHdr.iIkeData->iEspUdpPort)
			port = iHdr.iIkeData->iEspUdpPort;

		iNokiaNatt = CIkev1NokiaNattKeepAlive::NewL( iPluginSession,
		                                             addr,
		                                             port,
		                                             KeepAliveTimeout,
		                                             iDebug );
		}
	
	if ( !iHdr.iVirtualIp && aSaRekey )
	{
	   //
	   // Rekeyed IKE SA. No virtual IP address received in IKE SA
	   // negotiation. Get "old" virtual IP address saved into
	   // CSARekeyInfo object (if any).
	   //
		iHdr.StoreVirtualIp(aSaRekey->GetInternalAddr());
	}	

	
    //Lifetime in seconds
    iRemainingTime = iHdr.iLifeTimeSecs;
    if ( iRemainingTime == 0 ) 
        iRemainingTime = DEFAULT_MAX_ISAKMP_LIFETIME;

	//
	//  Check if IKE SA rekeying threshold value (per cent) defined
	//  If it is (value is between 70 - 95), use that per cent value
	//  as IKE SA timeout (Rekey for a new IKE SA is started then)
	//  "Left over" time is the expiration timeout for rekeyed IKE SA
	//  value which is used when rekey negotiation is started.
	//  The minimum value for that is set to 30 seconds
	//
	TInt RekeyThreshold = iHdr.iIkeData->iRekeyingThreshold;
	if ( RekeyThreshold != 0 )	
	{
	   if ( RekeyThreshold < 70 )
		    RekeyThreshold = 70;
	   else if ( RekeyThreshold > 95 )
		    RekeyThreshold = 95;
	   DEBUG_LOG1(_L("Negotiated ISAKMP Lifetime set to %u"),iRemainingTime);
	   iLeftOverTime   = iRemainingTime - ((iRemainingTime/100.0) * RekeyThreshold); 	
	   iRemainingTime -= iLeftOverTime;
	   if ( iLeftOverTime < 30 )
		   iLeftOverTime = 30;  
	} 		

    DEBUG_LOG1(_L("ISAKMP Lifetime set to %u"),iRemainingTime);
			
    //Lifetime in Kb
    iRemainingKB = iHdr.iLifeTimeKB;
    DEBUG_LOG1(_L("ISAKMP KB Lifetime set to %u"),iRemainingKB);

	StartTimer();			
			
}
Exemplo n.º 16
0
// ---------------------------------------------------------------------------
// From class CActive
// Handles completion of asynchronous notification request. 
// ---------------------------------------------------------------------------
//
void CErrorObserver::RunL()
    {
    DEBUG_LOG1(_L("IKE plugin session error=%d"), iStatus.Int());
    iCallback.IkePluginSessionError( iStatus.Int() );
    }
Exemplo n.º 17
0
void CIkeV2PkiService::BuildingCaListRunL()
    {       
    
    switch(iStatus.Int())
        {
        case KErrNone:
            {                        
            iIkeDataCAList->Delete(0);     
            
    	    ASSERT(iReadCertificate);
    		HBufC8* caCert = iReadCertificate; // Link CA buffer to CIkeCaElem
    		CleanupStack::PushL(caCert);		
    		
    		iReadCertificate = NULL;    		
    		iReadCertificate = HBufC8::NewL(KDefaultCertificateBufferSize);
    		iCertPtr.Set(iReadCertificate->Des());
    		
    		
     		CIkeCaElem* caElem = CIkeCaElem::NewL(caCert);
    		CleanupStack::Pop(caCert);		
    		CleanupStack::PushL(caElem);
    		
    		//Append ca cert to list, if not already present.
    		if (iTrustedCAList->FindCaElem(caElem->KeyHash()) == NULL)
    		    {    		    
    		    iTrustedCAList->AppendL(caElem);
    		    CleanupStack::Pop(caElem);
    		    }
            else
                {
                CleanupStack::PopAndDestroy(caElem);
                }
            
            if (iIkeDataCAList->Count() > 0)
                {
                ImportNextCaElemFromIkeDataListL();
                }
            else
                {
                
                if (iIkeData->iOwnCert.iOwnCertExists)
                    {
                    ReadTrustedUserCertificateL();
                    }
                else
                    {
                    SignalObserverL(KErrNone);
                    }
                }
            }
            break;
        case KPKIErrBufferTooShort:
            {
                
            DEBUG_LOG(_L("Buffer too short"));
            
            TInt certSize = 0;            
		    User::LeaveIfError(iPkiService.GetRequiredBufferSize(certSize));
            
            __ASSERT_DEBUG(iCertPtr.MaxLength() < certSize, User::Invariant());
            
            delete iReadCertificate;
            iReadCertificate = NULL;            
            iReadCertificate = HBufC8::NewL(certSize);
            iCertPtr.Set(iReadCertificate->Des());
            
            //Tries to reimport the certificate.
            ImportNextCaElemFromIkeDataListL();            
            }
            break;
        default:        
            DEBUG_LOG1(_L("Error code %d"), iStatus.Int());
            User::Leave(iStatus.Int());
            break;
        }
    }
Exemplo n.º 18
0
void CIkeV2PkiService::ImportNextCaElemFromIkeDataListL()
    {        
    __ASSERT_DEBUG(iIkeDataCAList != NULL, User::Invariant());
    __ASSERT_DEBUG(iIkeDataCAList->Count() > 0, User::Invariant());
    
    const TCertInfo certInfo = (*iIkeDataCAList)[0];        
    switch(certInfo.iFormat)
        {            
        case CA_NAME:    
            delete iSubjName;
            iSubjName = NULL;
            iSubjName = HBufC8::NewL(certInfo.iData.Length());
            iSubjName->Des().Copy(certInfo.iData);                    
        	iPkiService.ReadCertificateL(KEmptyString,
                                         *iSubjName, KEmptyString,
		                                 EPKICACertificate, 0,
		                                 EPKIRSA, iCertPtr,
		                                 &iResArray, iStatus);
            SET_ACTIVE;  
            break;                  
        case KEY_ID:
            if (!IkeParser::TextToHexOctets(certInfo.iData, iCertKeyId))
                {
                User::Leave(KErrArgument);
                }
            iPkiService.ReadCertificateL(iCertKeyId, iCertPtr,
            			                 &iResArray, iStatus);
            SET_ACTIVE;                     
            break;
       case APPL_UID:           
            {            
            //Get the list of applicable CA certs and appends it
            //to the original list, which was defined in the policy.
            //After this removes the currently handled node and
            //calls the method recursively.
            RArray<TUid>*  applUidList = IkeParser::GetApplUidListL(certInfo.iData);	
            CleanupStack::PushL(TCleanupItem(CIkeV2PkiServiceApplUidArrayCleanup,
                                 applUidList));

            CArrayFix<TCertificateListEntry>* applicableCaCertList;
            iPkiService.ListApplicableCertificatesL(*applUidList, applicableCaCertList);                                
            
            CleanupStack::PopAndDestroy(); //applUidList
                        
            if (applicableCaCertList->Count() > 0)
                {                                            
                CleanupStack::PushL(applicableCaCertList);
                TCertInfo* info = new (ELeave) TCertInfo;
                CleanupDeletePushL(info);
                for (TInt i = 0; i < applicableCaCertList->Count(); i++)
                    {
                    const TCertificateListEntry& entry = (*applicableCaCertList)[i];
                    info->iFormat = CA_NAME;
                    info->iData.Zero();
                    info->iData.Copy(entry.iIdentitySubjectName);

                    iIkeDataCAList->AppendL(*info);
                    DEBUG_LOG1(_L("Appending Applicable cert to the list (%S)"), &(info->iData));
                                                
                    }
                
                CleanupStack::PopAndDestroy(info);
                CleanupStack::PopAndDestroy(applicableCaCertList);
                
                iIkeDataCAList->Delete(0);                
                ImportNextCaElemFromIkeDataListL();
                }
            else
                {
                delete applicableCaCertList;
                applicableCaCertList = NULL;
                
                iStatus = KRequestPending;
                SET_ACTIVE;
                
                TRequestStatus* status = &iStatus;
                User::RequestComplete(status, KErrNotFound);                
                }                                                                
            }
            break;
        default:
            User::Leave(KErrArgument);                
            break;
        }
    }
Exemplo n.º 19
0
TInt CIkev1SA::RunError(TInt aError)
    {
    DEBUG_LOG1(_L("CIkev1SA::RunError, err=%d"), aError);
    iPluginSession.HandleError(aError);
    return KErrNone;
    }
Exemplo n.º 20
0
TBool CIkev1Payloads::ParsePayloadsL(const ThdrISAKMP &aHdr)
{

	TBool   Status = ETrue;
	TUint16 ptype  = aHdr.GetPayload();
	const TPayloadISAKMP* payload = (const TPayloadISAKMP*)aHdr.Next();
	iPadding = aHdr.GetLength() - sizeof(aHdr);
	
	while ( ptype != ISAKMP_PAYLOAD_NONE )
	{
		
		if (!iNegotiation.CheckGenericPayloadL(payload))  //Checks the generic payload is OK
		{
			Status = EFalse;
			break;
		}

		switch (ptype)
		{
			
			case ISAKMP_PAYLOAD_SA: //also includes proposal and transform
				DEBUG_LOG(_L("[SA]"));
				if ( !iSa )	 // Only one SA payload (The first)	
				   iSa = TSAISAKMP::Ptr(payload);
				break;

			case ISAKMP_PAYLOAD_KE: 
				DEBUG_LOG(_L("[KE]"));
				if ( !iKe )	 // Only one KE payload (The first)	
				   iKe = TKeyISAKMP::Ptr(payload);
				break;

			case ISAKMP_PAYLOAD_ID: 
				DEBUG_LOG(_L("[ID]"));
				iIds->AppendL(TIdentISAKMP::Ptr(payload));
				break;

			case ISAKMP_PAYLOAD_CERT:
				DEBUG_LOG(_L("[CERT]"));
				iCerts->AppendL(TCertificateISAKMP::Ptr(payload));
				break;
				
			case ISAKMP_PAYLOAD_CR: 
				DEBUG_LOG(_L("[CR]"));
				iCertReqs->AppendL(TCertificateReqISAKMP::Ptr(payload));
				break;

			case ISAKMP_PAYLOAD_HASH:
				DEBUG_LOG(_L("[HASH]"));
				if ( !iHash )	 // Only one HASH payload (The first)	
				   iHash = THashISAKMP::Ptr(payload);
				break;

			case ISAKMP_PAYLOAD_SIG:
				DEBUG_LOG(_L("[SIG]"));
				if ( !iSign )	 // Only one HASH payload (The first)	
				   iSign = TSignatureISAKMP::Ptr(payload);
				break;

			case ISAKMP_PAYLOAD_NONCE:
				DEBUG_LOG(_L("[NONCE]"));
				if ( !iNonce )	 // Only one NONCE payload (The first)	
				   iNonce = TNonceISAKMP::Ptr(payload);
				break;

			case ISAKMP_PAYLOAD_NOTIF:
				DEBUG_LOG(_L("[NOTIF]"));
				iNotifs->AppendL(TNotificationISAKMP::Ptr(payload));						
				break;

			case ISAKMP_PAYLOAD_D:
				DEBUG_LOG(_L("[DELETE]"));
				iDeletes->AppendL(TDeleteISAKMP::Ptr(payload));						
				break;
				
			case ISAKMP_PAYLOAD_VID:
				DEBUG_LOG(_L("[VID]"));
				iVids->AppendL(TVendorISAKMP::Ptr(payload));
				break;
				
            //
			// Extensions payloads  
			//
			case ISAKMP_PAYLOAD_ATTRIBUTES:
				DEBUG_LOG(_L("[ATTR]"));
				if ( !iAttr )	 // Only one ATTR payload (The first)	
				   iAttr = TAttributeISAKMP::Ptr(payload);
				break;
			
			case ISAKMP_PAYLOAD_CHRE:
				DEBUG_LOG(_L("[CHRE]"));
				if ( !iChre )	 // Only one CHRE payload (The first)	
			       iChre = TCHREISAKMP::Ptr(payload);
                break;

			case ISAKMP_INT_NETWORK:
				DEBUG_LOG(_L("[IA]"));
				if ( !iIaddr )	 // Only one IA payload (The first)	
				   iIaddr = TINTNETISAKMP::Ptr(payload);
				break;  		
				
			case IETF_NAT_DISCOVERY:
				DEBUG_LOG(_L("[NAT-D]"));
				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
				break;
				
			case IETF_RFC_NAT_DISCOVERY:
				DEBUG_LOG(_L("[NAT-D]"));
				iNatDs->AppendL(TNATDISAKMP::Ptr(payload));
				break;	

			case IETF_NAT_ORIG_ADDR:
				DEBUG_LOG(_L("[NAT-OA]"));
				if ( !iNatOa )	 // Only one NONCE payload (The first)	
				   iNatOa = TNATOaISAKMP::Ptr(payload);
				break;
			
			case IETF_RFC_NAT_ORIG_ADDR:
				DEBUG_LOG(_L("[NAT-OA]"));
				if ( !iNatOa )	 // Only one NONCE payload (The first)	
				   iNatOa = TNATOaISAKMP::Ptr(payload);
				break;
			//
			// Unknown payloads are queued into iGenPlds array
			//
			default: 
				DEBUG_LOG1(_L("[PL TYPE (%d)]"),ptype);
				iGenPlds->AppendL(payload);												
				break;
				
		}

		iPadding -= payload->GetLength(); 
		ptype     = payload->GetPayload();
		payload   = payload->Next();
	}

	return Status;
}